Merge branch '2016.11-develop' into 2017.02 2017.02
authorPhilipp Schüle <p.schuele@metaways.de>
Wed, 2 Aug 2017 07:57:09 +0000 (09:57 +0200)
committerPhilipp Schüle <p.schuele@metaways.de>
Wed, 2 Aug 2017 07:57:09 +0000 (09:57 +0200)
Change-Id: I2777aae751aae52bf381399950e07c52fba7b9a1

1324 files changed:
tests/setup/Setup/CliTest.php
tests/setup/Setup/ControllerTest.php
tests/setup/Setup/JsonTest.php
tests/tine20/Addressbook/Backend/SqlTest.php
tests/tine20/Addressbook/ControllerTest.php
tests/tine20/Addressbook/Import/CsvTest.php
tests/tine20/Admin/JsonTest.php
tests/tine20/Calendar/Backend/SqlTest.php
tests/tine20/Calendar/Controller/EventTests.php
tests/tine20/Calendar/JsonTests.php
tests/tine20/Crm/Acl/RolesTest.php
tests/tine20/ExampleApplication/ControllerTest.php
tests/tine20/Felamimail/Controller/AccountTest.php
tests/tine20/Felamimail/Frontend/JsonTest.php
tests/tine20/Filemanager/ControllerTests.php
tests/tine20/Filemanager/Frontend/JsonTests.php
tests/tine20/MailFiler/Frontend/JsonTests.php
tests/tine20/TestCase.php
tests/tine20/Tinebase/Acl/RolesTest.php
tests/tine20/Tinebase/Auth/SecondFactor/Mock.php
tests/tine20/Tinebase/AuthTest.php
tests/tine20/Tinebase/ConfigTest.php
tests/tine20/Tinebase/FileSystemTest.php
tests/tine20/Tinebase/Frontend/CliTest.php
tests/tine20/Tinebase/Frontend/JsonTest.php
tests/tine20/Tinebase/PreferenceTest.php
tests/tine20/Tinebase/Server/JsonTests.php
tests/tine20/Tinebase/Timemachine/ModificationLogTest.php
tests/tine20/Tinebase/User/EmailUser/Imap/DovecotTest.php
tests/tine20/Tinebase/User/EmailUser/Smtp/PostfixTest.php
tine20/ActiveSync/translations/bg.po
tine20/ActiveSync/translations/ca.po
tine20/ActiveSync/translations/cs.po
tine20/ActiveSync/translations/cs_CZ.po
tine20/ActiveSync/translations/da.po
tine20/ActiveSync/translations/de.po
tine20/ActiveSync/translations/el_GR.po
tine20/ActiveSync/translations/en.po
tine20/ActiveSync/translations/en_AU.po
tine20/ActiveSync/translations/en_NZ.po
tine20/ActiveSync/translations/es.po
tine20/ActiveSync/translations/es_MX.po
tine20/ActiveSync/translations/et.po
tine20/ActiveSync/translations/fa_IR.po
tine20/ActiveSync/translations/fi.po
tine20/ActiveSync/translations/fr.po
tine20/ActiveSync/translations/he.po
tine20/ActiveSync/translations/he_IL.po
tine20/ActiveSync/translations/hr_HR.po
tine20/ActiveSync/translations/hu.po
tine20/ActiveSync/translations/it.po
tine20/ActiveSync/translations/ja.po
tine20/ActiveSync/translations/ja_JP.po
tine20/ActiveSync/translations/ko.po
tine20/ActiveSync/translations/ko_KR.po
tine20/ActiveSync/translations/lt.po
tine20/ActiveSync/translations/nb.po
tine20/ActiveSync/translations/nl_NL.po
tine20/ActiveSync/translations/pl.po
tine20/ActiveSync/translations/pt_BR.po
tine20/ActiveSync/translations/ro_RO.po
tine20/ActiveSync/translations/ru.po
tine20/ActiveSync/translations/sk.po
tine20/ActiveSync/translations/sl.po
tine20/ActiveSync/translations/sq.po
tine20/ActiveSync/translations/sv_SE.po
tine20/ActiveSync/translations/template.pot
tine20/ActiveSync/translations/th.po
tine20/ActiveSync/translations/tr_TR.po
tine20/ActiveSync/translations/vi.po
tine20/ActiveSync/translations/vi_VN.po
tine20/ActiveSync/translations/zh_CN.po
tine20/ActiveSync/translations/zh_TW.po
tine20/Addressbook/Controller/List.php
tine20/Addressbook/Export/List/Doc.php
tine20/Addressbook/Export/List/Trait.php [new file with mode: 0644]
tine20/Addressbook/Export/List/Xls.php
tine20/Addressbook/Export/Xls.php
tine20/Addressbook/Export/definitions/adb_default_ods.xml
tine20/Addressbook/Export/definitions/adb_doc.xml
tine20/Addressbook/Export/definitions/adb_doc_letter.xml
tine20/Addressbook/Export/definitions/adb_list_doc.xml
tine20/Addressbook/Export/definitions/adb_list_overview_xls.xml [new file with mode: 0644]
tine20/Addressbook/Export/definitions/adb_list_xls.xml
tine20/Addressbook/Export/definitions/adb_xls.xml
tine20/Addressbook/Export/definitions/adb_xls_overview.xml [new file with mode: 0644]
tine20/Addressbook/Export/templates/addressbook_contact_overview.xlsx [new file with mode: 0644]
tine20/Addressbook/Export/templates/addressbook_list_overview.xlsx [new file with mode: 0644]
tine20/Addressbook/Model/Contact.php
tine20/Addressbook/Model/List.php
tine20/Addressbook/Model/ListFilter.php
tine20/Addressbook/Setup/Update/Release10.php
tine20/Addressbook/Setup/setup.xml
tine20/Addressbook/js/AddressRenderer.js
tine20/Addressbook/js/CardDAVContainerPropertiesHookField.js
tine20/Addressbook/js/ContactEditDialog.js
tine20/Addressbook/js/ListMemberRoleGridPanel.js
tine20/Addressbook/js/Printer/ContactRecord.js
tine20/Addressbook/js/Printer/ListRecord.js
tine20/Addressbook/translations/bg.po
tine20/Addressbook/translations/ca.po
tine20/Addressbook/translations/cs.po
tine20/Addressbook/translations/cs_CZ.po
tine20/Addressbook/translations/da.po
tine20/Addressbook/translations/de.po
tine20/Addressbook/translations/el_GR.po
tine20/Addressbook/translations/en.po
tine20/Addressbook/translations/en_AU.po
tine20/Addressbook/translations/en_NZ.po
tine20/Addressbook/translations/es.po
tine20/Addressbook/translations/es_MX.po
tine20/Addressbook/translations/et.po
tine20/Addressbook/translations/fa_IR.po
tine20/Addressbook/translations/fi.po
tine20/Addressbook/translations/fr.po
tine20/Addressbook/translations/he.po
tine20/Addressbook/translations/he_IL.po
tine20/Addressbook/translations/hr_HR.po
tine20/Addressbook/translations/hu.po
tine20/Addressbook/translations/it.po
tine20/Addressbook/translations/ja.po
tine20/Addressbook/translations/ja_JP.po
tine20/Addressbook/translations/ko.po
tine20/Addressbook/translations/ko_KR.po
tine20/Addressbook/translations/lt.po
tine20/Addressbook/translations/nb.po
tine20/Addressbook/translations/nl_NL.po
tine20/Addressbook/translations/pl.po
tine20/Addressbook/translations/pt_BR.po
tine20/Addressbook/translations/ro_RO.po
tine20/Addressbook/translations/ru.po
tine20/Addressbook/translations/sk.po
tine20/Addressbook/translations/sl.po
tine20/Addressbook/translations/sq.po
tine20/Addressbook/translations/sv_SE.po
tine20/Addressbook/translations/template.pot
tine20/Addressbook/translations/th.po
tine20/Addressbook/translations/tr_TR.po
tine20/Addressbook/translations/vi.po
tine20/Addressbook/translations/vi_VN.po
tine20/Addressbook/translations/zh_CN.po
tine20/Addressbook/translations/zh_TW.po
tine20/Admin/Acl/Rights.php
tine20/Admin/Config.php
tine20/Admin/Controller/Container.php
tine20/Admin/Controller/Keyfield.php [deleted file]
tine20/Admin/Controller/SambaMachine.php
tine20/Admin/Controller/Tags.php
tine20/Admin/Controller/User.php
tine20/Admin/Frontend/Json.php
tine20/Admin/Setup/Initialize.php
tine20/Admin/js/Admin.js
tine20/Admin/js/user/GridPanel.js
tine20/Admin/translations/bg.po
tine20/Admin/translations/ca.po
tine20/Admin/translations/cs.po
tine20/Admin/translations/cs_CZ.po
tine20/Admin/translations/da.po
tine20/Admin/translations/de.po
tine20/Admin/translations/el_GR.po
tine20/Admin/translations/en.po
tine20/Admin/translations/en_AU.po
tine20/Admin/translations/en_NZ.po
tine20/Admin/translations/es.po
tine20/Admin/translations/es_MX.po
tine20/Admin/translations/et.po
tine20/Admin/translations/fa_IR.po
tine20/Admin/translations/fi.po
tine20/Admin/translations/fr.po
tine20/Admin/translations/he.po
tine20/Admin/translations/he_IL.po
tine20/Admin/translations/hr_HR.po
tine20/Admin/translations/hu.po
tine20/Admin/translations/it.po
tine20/Admin/translations/ja.po
tine20/Admin/translations/ja_JP.po
tine20/Admin/translations/ko.po
tine20/Admin/translations/ko_KR.po
tine20/Admin/translations/lt.po
tine20/Admin/translations/nb.po
tine20/Admin/translations/nl_NL.po
tine20/Admin/translations/pl.po
tine20/Admin/translations/pt_BR.po
tine20/Admin/translations/ro_RO.po
tine20/Admin/translations/ru.po
tine20/Admin/translations/sk.po
tine20/Admin/translations/sl.po
tine20/Admin/translations/sq.po
tine20/Admin/translations/sv_SE.po
tine20/Admin/translations/template.pot
tine20/Admin/translations/th.po
tine20/Admin/translations/tr_TR.po
tine20/Admin/translations/vi.po
tine20/Admin/translations/vi_VN.po
tine20/Admin/translations/zh_CN.po
tine20/Admin/translations/zh_TW.po
tine20/Calendar/Backend/Sql.php
tine20/Calendar/Controller.php
tine20/Calendar/Controller/Event.php
tine20/Calendar/Controller/EventNotifications.php
tine20/Calendar/Controller/MSEventFacade.php
tine20/Calendar/Controller/Resource.php
tine20/Calendar/Convert/Event/VCalendar/Abstract.php
tine20/Calendar/Event/InspectDeleteEvent.php [new file with mode: 0644]
tine20/Calendar/Event/InspectEvent.php [new file with mode: 0644]
tine20/Calendar/Export/GenericTrait.php
tine20/Calendar/Export/definitions/cal_default_doc_single.xml [new file with mode: 0644]
tine20/Calendar/Export/definitions/cal_resource_doc.xml
tine20/Calendar/Export/definitions/cal_resource_xls.xml
tine20/Calendar/Export/definitions/cal_resource_xls_overview.xml [new file with mode: 0644]
tine20/Calendar/Export/templates/calendar_export.docx [new file with mode: 0644]
tine20/Calendar/Export/templates/calendar_resource_overview.xlsx [new file with mode: 0644]
tine20/Calendar/Frontend/Cli.php
tine20/Calendar/Frontend/Http.php
tine20/Calendar/Frontend/Json.php
tine20/Calendar/Import/Abstract.php
tine20/Calendar/Model/Attender.php
tine20/Calendar/Model/Event.php
tine20/Calendar/Model/Resource.php
tine20/Calendar/Model/ResourceFilter.php
tine20/Calendar/Model/Rrule.php
tine20/Calendar/Setup/Update/Release10.php
tine20/Calendar/Setup/setup.xml
tine20/Calendar/css/Calendar.css
tine20/Calendar/js/AbstractView.js
tine20/Calendar/js/AddToEventPanel.js
tine20/Calendar/js/AttendeeGridPanel.js
tine20/Calendar/js/AttendeePickerCombo.js
tine20/Calendar/js/Calendar.js
tine20/Calendar/js/ColorManager.js
tine20/Calendar/js/DaysView.js
tine20/Calendar/js/DaysViewEventUI.js
tine20/Calendar/js/EventEditDialog.js
tine20/Calendar/js/EventFinderOptionsDialog.js
tine20/Calendar/js/EventUI.js
tine20/Calendar/js/FreeBusyInfo.js
tine20/Calendar/js/FreeTimeSearchDialog.js [new file with mode: 0644]
tine20/Calendar/js/MainScreenCenterPanel.js
tine20/Calendar/js/Model.js
tine20/Calendar/js/PagingToolbar.js
tine20/Calendar/js/Printer/DaysView.js
tine20/Calendar/js/Printer/EventRecord.js
tine20/Calendar/js/SearchCombo.js
tine20/Calendar/js/TreePanel.js
tine20/Calendar/translations/bg.po
tine20/Calendar/translations/ca.po
tine20/Calendar/translations/cs.po
tine20/Calendar/translations/cs_CZ.po
tine20/Calendar/translations/da.po
tine20/Calendar/translations/de.po
tine20/Calendar/translations/el_GR.po
tine20/Calendar/translations/en.po
tine20/Calendar/translations/en_AU.po
tine20/Calendar/translations/en_NZ.po
tine20/Calendar/translations/es.po
tine20/Calendar/translations/es_MX.po
tine20/Calendar/translations/et.po
tine20/Calendar/translations/fa_IR.po
tine20/Calendar/translations/fi.po
tine20/Calendar/translations/fr.po
tine20/Calendar/translations/he.po
tine20/Calendar/translations/he_IL.po
tine20/Calendar/translations/hr_HR.po
tine20/Calendar/translations/hu.po
tine20/Calendar/translations/it.po
tine20/Calendar/translations/ja.po
tine20/Calendar/translations/ja_JP.po
tine20/Calendar/translations/ko.po
tine20/Calendar/translations/ko_KR.po
tine20/Calendar/translations/lt.po
tine20/Calendar/translations/nb.po
tine20/Calendar/translations/nl_NL.po
tine20/Calendar/translations/pl.po
tine20/Calendar/translations/pt_BR.po
tine20/Calendar/translations/ro_RO.po
tine20/Calendar/translations/ru.po
tine20/Calendar/translations/sk.po
tine20/Calendar/translations/sl.po
tine20/Calendar/translations/sq.po
tine20/Calendar/translations/sv_SE.po
tine20/Calendar/translations/template.pot
tine20/Calendar/translations/th.po
tine20/Calendar/translations/tr_TR.po
tine20/Calendar/translations/vi.po
tine20/Calendar/translations/vi_VN.po
tine20/Calendar/translations/zh_CN.po
tine20/Calendar/translations/zh_TW.po
tine20/Calendar/views/eventNotification.php
tine20/CoreData/translations/bg.po
tine20/CoreData/translations/ca.po
tine20/CoreData/translations/cs.po
tine20/CoreData/translations/cs_CZ.po [new file with mode: 0644]
tine20/CoreData/translations/da.po
tine20/CoreData/translations/de.po
tine20/CoreData/translations/el_GR.po
tine20/CoreData/translations/en.po
tine20/CoreData/translations/en_AU.po
tine20/CoreData/translations/en_NZ.po
tine20/CoreData/translations/es.po
tine20/CoreData/translations/es_MX.po
tine20/CoreData/translations/et.po
tine20/CoreData/translations/fa_IR.po
tine20/CoreData/translations/fi.po
tine20/CoreData/translations/fr.po
tine20/CoreData/translations/he.po [new file with mode: 0644]
tine20/CoreData/translations/he_IL.po [new file with mode: 0644]
tine20/CoreData/translations/hr_HR.po
tine20/CoreData/translations/hu.po
tine20/CoreData/translations/it.po
tine20/CoreData/translations/ja.po
tine20/CoreData/translations/ja_JP.po [new file with mode: 0644]
tine20/CoreData/translations/ko.po
tine20/CoreData/translations/ko_KR.po
tine20/CoreData/translations/lt.po
tine20/CoreData/translations/nb.po
tine20/CoreData/translations/nl_NL.po
tine20/CoreData/translations/pl.po
tine20/CoreData/translations/pt_BR.po
tine20/CoreData/translations/ro_RO.po
tine20/CoreData/translations/ru.po
tine20/CoreData/translations/sk.po
tine20/CoreData/translations/sl.po
tine20/CoreData/translations/sq.po [new file with mode: 0644]
tine20/CoreData/translations/sv_SE.po [new file with mode: 0644]
tine20/CoreData/translations/template.pot
tine20/CoreData/translations/th.po [new file with mode: 0644]
tine20/CoreData/translations/tr_TR.po [new file with mode: 0644]
tine20/CoreData/translations/vi.po [new file with mode: 0644]
tine20/CoreData/translations/vi_VN.po [new file with mode: 0644]
tine20/CoreData/translations/zh_CN.po [new file with mode: 0644]
tine20/CoreData/translations/zh_TW.po [new file with mode: 0644]
tine20/Courses/translations/bg.po
tine20/Courses/translations/ca.po
tine20/Courses/translations/cs.po
tine20/Courses/translations/cs_CZ.po
tine20/Courses/translations/da.po
tine20/Courses/translations/de.po
tine20/Courses/translations/el_GR.po
tine20/Courses/translations/en.po
tine20/Courses/translations/en_AU.po
tine20/Courses/translations/en_NZ.po
tine20/Courses/translations/es.po
tine20/Courses/translations/es_MX.po
tine20/Courses/translations/et.po
tine20/Courses/translations/fa_IR.po
tine20/Courses/translations/fi.po
tine20/Courses/translations/fr.po
tine20/Courses/translations/he.po
tine20/Courses/translations/he_IL.po
tine20/Courses/translations/hr_HR.po
tine20/Courses/translations/hu.po
tine20/Courses/translations/it.po
tine20/Courses/translations/ja.po
tine20/Courses/translations/ja_JP.po
tine20/Courses/translations/ko.po
tine20/Courses/translations/ko_KR.po
tine20/Courses/translations/lt.po
tine20/Courses/translations/nb.po
tine20/Courses/translations/nl_NL.po
tine20/Courses/translations/pl.po
tine20/Courses/translations/pt_BR.po
tine20/Courses/translations/ro_RO.po
tine20/Courses/translations/ru.po
tine20/Courses/translations/sk.po
tine20/Courses/translations/sl.po
tine20/Courses/translations/sq.po
tine20/Courses/translations/sv_SE.po
tine20/Courses/translations/template.pot
tine20/Courses/translations/th.po
tine20/Courses/translations/tr_TR.po
tine20/Courses/translations/vi.po
tine20/Courses/translations/vi_VN.po
tine20/Courses/translations/zh_CN.po
tine20/Courses/translations/zh_TW.po
tine20/Crm/Setup/Update/Release10.php
tine20/Crm/Setup/setup.xml
tine20/Crm/js/LeadEditDialog.js
tine20/Crm/translations/bg.po
tine20/Crm/translations/ca.po
tine20/Crm/translations/cs.po
tine20/Crm/translations/cs_CZ.po
tine20/Crm/translations/da.po
tine20/Crm/translations/de.po
tine20/Crm/translations/el_GR.po
tine20/Crm/translations/en.po
tine20/Crm/translations/en_AU.po
tine20/Crm/translations/en_NZ.po
tine20/Crm/translations/es.po
tine20/Crm/translations/es_MX.po
tine20/Crm/translations/et.po
tine20/Crm/translations/fa_IR.po
tine20/Crm/translations/fi.po
tine20/Crm/translations/fr.po
tine20/Crm/translations/he.po
tine20/Crm/translations/he_IL.po
tine20/Crm/translations/hr_HR.po
tine20/Crm/translations/hu.po
tine20/Crm/translations/it.po
tine20/Crm/translations/ja.po
tine20/Crm/translations/ja_JP.po
tine20/Crm/translations/ko.po
tine20/Crm/translations/ko_KR.po
tine20/Crm/translations/lt.po
tine20/Crm/translations/nb.po
tine20/Crm/translations/nl_NL.po
tine20/Crm/translations/pl.po
tine20/Crm/translations/pt_BR.po
tine20/Crm/translations/ro_RO.po
tine20/Crm/translations/ru.po
tine20/Crm/translations/sk.po
tine20/Crm/translations/sl.po
tine20/Crm/translations/sq.po
tine20/Crm/translations/sv_SE.po
tine20/Crm/translations/template.pot
tine20/Crm/translations/th.po
tine20/Crm/translations/tr_TR.po
tine20/Crm/translations/vi.po
tine20/Crm/translations/vi_VN.po
tine20/Crm/translations/zh_CN.po
tine20/Crm/translations/zh_TW.po
tine20/Events/Setup/Update/Release10.php
tine20/Events/Setup/setup.xml
tine20/Events/translations/bg.po [new file with mode: 0644]
tine20/Events/translations/ca.po [new file with mode: 0644]
tine20/Events/translations/cs.po [new file with mode: 0644]
tine20/Events/translations/cs_CZ.po [new file with mode: 0644]
tine20/Events/translations/da.po [new file with mode: 0644]
tine20/Events/translations/de.po
tine20/Events/translations/el_GR.po [new file with mode: 0644]
tine20/Events/translations/en.po
tine20/Events/translations/en_AU.po [new file with mode: 0644]
tine20/Events/translations/en_NZ.po [new file with mode: 0644]
tine20/Events/translations/es.po [new file with mode: 0644]
tine20/Events/translations/es_MX.po [new file with mode: 0644]
tine20/Events/translations/et.po [new file with mode: 0644]
tine20/Events/translations/fa_IR.po [new file with mode: 0644]
tine20/Events/translations/fi.po [new file with mode: 0644]
tine20/Events/translations/fr.po [new file with mode: 0644]
tine20/Events/translations/he.po [new file with mode: 0644]
tine20/Events/translations/he_IL.po [new file with mode: 0644]
tine20/Events/translations/hr_HR.po [new file with mode: 0644]
tine20/Events/translations/hu.po [new file with mode: 0644]
tine20/Events/translations/it.po [new file with mode: 0644]
tine20/Events/translations/ja.po [new file with mode: 0644]
tine20/Events/translations/ja_JP.po [new file with mode: 0644]
tine20/Events/translations/ko.po [new file with mode: 0644]
tine20/Events/translations/ko_KR.po [new file with mode: 0644]
tine20/Events/translations/lt.po [new file with mode: 0644]
tine20/Events/translations/nb.po [new file with mode: 0644]
tine20/Events/translations/nl_NL.po [new file with mode: 0644]
tine20/Events/translations/pl.po [new file with mode: 0644]
tine20/Events/translations/pt_BR.po [new file with mode: 0644]
tine20/Events/translations/ro_RO.po [new file with mode: 0644]
tine20/Events/translations/ru.po [new file with mode: 0644]
tine20/Events/translations/sk.po [new file with mode: 0644]
tine20/Events/translations/sl.po [new file with mode: 0644]
tine20/Events/translations/sq.po [new file with mode: 0644]
tine20/Events/translations/sv_SE.po [new file with mode: 0644]
tine20/Events/translations/template.pot
tine20/Events/translations/th.po [new file with mode: 0644]
tine20/Events/translations/tr_TR.po [new file with mode: 0644]
tine20/Events/translations/vi.po [new file with mode: 0644]
tine20/Events/translations/vi_VN.po [new file with mode: 0644]
tine20/Events/translations/zh_CN.po [new file with mode: 0644]
tine20/Events/translations/zh_TW.po [new file with mode: 0644]
tine20/ExampleApplication/translations/bg.po
tine20/ExampleApplication/translations/ca.po
tine20/ExampleApplication/translations/cs.po
tine20/ExampleApplication/translations/cs_CZ.po [new file with mode: 0644]
tine20/ExampleApplication/translations/da.po [new file with mode: 0644]
tine20/ExampleApplication/translations/de.po
tine20/ExampleApplication/translations/el_GR.po [new file with mode: 0644]
tine20/ExampleApplication/translations/en.po
tine20/ExampleApplication/translations/en_AU.po [new file with mode: 0644]
tine20/ExampleApplication/translations/en_NZ.po [new file with mode: 0644]
tine20/ExampleApplication/translations/es.po
tine20/ExampleApplication/translations/es_MX.po [new file with mode: 0644]
tine20/ExampleApplication/translations/et.po [new file with mode: 0644]
tine20/ExampleApplication/translations/fa_IR.po [new file with mode: 0644]
tine20/ExampleApplication/translations/fi.po [new file with mode: 0644]
tine20/ExampleApplication/translations/fr.po
tine20/ExampleApplication/translations/he.po [new file with mode: 0644]
tine20/ExampleApplication/translations/he_IL.po [new file with mode: 0644]
tine20/ExampleApplication/translations/hr_HR.po [new file with mode: 0644]
tine20/ExampleApplication/translations/hu.po
tine20/ExampleApplication/translations/it.po
tine20/ExampleApplication/translations/ja.po
tine20/ExampleApplication/translations/ja_JP.po [new file with mode: 0644]
tine20/ExampleApplication/translations/ko.po [new file with mode: 0644]
tine20/ExampleApplication/translations/ko_KR.po [new file with mode: 0644]
tine20/ExampleApplication/translations/lt.po [new file with mode: 0644]
tine20/ExampleApplication/translations/nb.po
tine20/ExampleApplication/translations/nl_NL.po [new file with mode: 0644]
tine20/ExampleApplication/translations/pl.po
tine20/ExampleApplication/translations/pt_BR.po [new file with mode: 0644]
tine20/ExampleApplication/translations/ro_RO.po [new file with mode: 0644]
tine20/ExampleApplication/translations/ru.po
tine20/ExampleApplication/translations/sk.po [new file with mode: 0644]
tine20/ExampleApplication/translations/sl.po [new file with mode: 0644]
tine20/ExampleApplication/translations/sq.po [new file with mode: 0644]
tine20/ExampleApplication/translations/sv_SE.po [new file with mode: 0644]
tine20/ExampleApplication/translations/template.pot
tine20/ExampleApplication/translations/th.po [new file with mode: 0644]
tine20/ExampleApplication/translations/tr_TR.po [new file with mode: 0644]
tine20/ExampleApplication/translations/vi.po [new file with mode: 0644]
tine20/ExampleApplication/translations/vi_VN.po [new file with mode: 0644]
tine20/ExampleApplication/translations/zh_CN.po
tine20/ExampleApplication/translations/zh_TW.po
tine20/Felamimail/Controller/Account.php
tine20/Felamimail/Controller/Message.php
tine20/Felamimail/Controller/Message/Send.php
tine20/Felamimail/Model/Account.php
tine20/Felamimail/js/FolderStore.js
tine20/Felamimail/js/MessageEditDialog.js
tine20/Felamimail/js/TreePanel.js
tine20/Felamimail/translations/bg.po
tine20/Felamimail/translations/ca.po
tine20/Felamimail/translations/cs.po
tine20/Felamimail/translations/cs_CZ.po
tine20/Felamimail/translations/da.po
tine20/Felamimail/translations/de.po
tine20/Felamimail/translations/el_GR.po
tine20/Felamimail/translations/en.po
tine20/Felamimail/translations/en_AU.po
tine20/Felamimail/translations/en_NZ.po
tine20/Felamimail/translations/es.po
tine20/Felamimail/translations/es_MX.po
tine20/Felamimail/translations/et.po
tine20/Felamimail/translations/fa_IR.po
tine20/Felamimail/translations/fi.po
tine20/Felamimail/translations/fr.po
tine20/Felamimail/translations/he.po
tine20/Felamimail/translations/he_IL.po
tine20/Felamimail/translations/hr_HR.po
tine20/Felamimail/translations/hu.po
tine20/Felamimail/translations/it.po
tine20/Felamimail/translations/ja.po
tine20/Felamimail/translations/ja_JP.po
tine20/Felamimail/translations/ko.po
tine20/Felamimail/translations/ko_KR.po
tine20/Felamimail/translations/lt.po
tine20/Felamimail/translations/nb.po
tine20/Felamimail/translations/nl_NL.po
tine20/Felamimail/translations/pl.po
tine20/Felamimail/translations/pt_BR.po
tine20/Felamimail/translations/ro_RO.po
tine20/Felamimail/translations/ru.po
tine20/Felamimail/translations/sk.po
tine20/Felamimail/translations/sl.po
tine20/Felamimail/translations/sq.po
tine20/Felamimail/translations/sv_SE.po
tine20/Felamimail/translations/template.pot
tine20/Felamimail/translations/th.po
tine20/Felamimail/translations/tr_TR.po
tine20/Felamimail/translations/vi.po
tine20/Felamimail/translations/vi_VN.po
tine20/Felamimail/translations/zh_CN.po
tine20/Felamimail/translations/zh_TW.po
tine20/Filemanager/Config.php
tine20/Filemanager/Controller/DownloadLink.php
tine20/Filemanager/Controller/Node.php
tine20/Filemanager/Frontend/Http.php
tine20/Filemanager/Frontend/Json.php
tine20/Filemanager/js/DocumentPreview.js
tine20/Filemanager/js/DownloadLinkGridPanel.js
tine20/Filemanager/js/GrantsPanel.js
tine20/Filemanager/js/Model.js
tine20/Filemanager/js/NodeEditDialog.js
tine20/Filemanager/js/NodeGridPanel.js
tine20/Filemanager/js/NodeTreePanel.js
tine20/Filemanager/js/NotificationPanel.js
tine20/Filemanager/js/nodeActions.js
tine20/Filemanager/translations/bg.po
tine20/Filemanager/translations/ca.po
tine20/Filemanager/translations/cs.po
tine20/Filemanager/translations/cs_CZ.po
tine20/Filemanager/translations/da.po
tine20/Filemanager/translations/de.po
tine20/Filemanager/translations/de.temp.po [new file with mode: 0644]
tine20/Filemanager/translations/el_GR.po
tine20/Filemanager/translations/en.po
tine20/Filemanager/translations/en_AU.po
tine20/Filemanager/translations/en_NZ.po
tine20/Filemanager/translations/es.po
tine20/Filemanager/translations/es_MX.po
tine20/Filemanager/translations/et.po
tine20/Filemanager/translations/fa_IR.po
tine20/Filemanager/translations/fi.po
tine20/Filemanager/translations/fr.po
tine20/Filemanager/translations/he.po
tine20/Filemanager/translations/he_IL.po
tine20/Filemanager/translations/hr_HR.po
tine20/Filemanager/translations/hu.po
tine20/Filemanager/translations/it.po
tine20/Filemanager/translations/ja.po
tine20/Filemanager/translations/ja_JP.po
tine20/Filemanager/translations/ko.po
tine20/Filemanager/translations/ko_KR.po
tine20/Filemanager/translations/lt.po
tine20/Filemanager/translations/nb.po
tine20/Filemanager/translations/nl_NL.po
tine20/Filemanager/translations/pl.po
tine20/Filemanager/translations/pt_BR.po
tine20/Filemanager/translations/ro_RO.po
tine20/Filemanager/translations/ru.po
tine20/Filemanager/translations/sk.po
tine20/Filemanager/translations/sl.po
tine20/Filemanager/translations/sq.po
tine20/Filemanager/translations/sv_SE.po
tine20/Filemanager/translations/template.pot
tine20/Filemanager/translations/th.po
tine20/Filemanager/translations/tr_TR.po
tine20/Filemanager/translations/vi.po
tine20/Filemanager/translations/vi_VN.po
tine20/Filemanager/translations/zh_CN.po
tine20/Filemanager/translations/zh_TW.po
tine20/HumanResources/Config.php
tine20/HumanResources/Setup/Update/Release10.php
tine20/HumanResources/Setup/setup.xml
tine20/HumanResources/translations/bg.po
tine20/HumanResources/translations/ca.po
tine20/HumanResources/translations/cs.po
tine20/HumanResources/translations/cs_CZ.po
tine20/HumanResources/translations/da.po
tine20/HumanResources/translations/de.po
tine20/HumanResources/translations/el_GR.po
tine20/HumanResources/translations/en.po
tine20/HumanResources/translations/en_AU.po
tine20/HumanResources/translations/en_NZ.po
tine20/HumanResources/translations/es.po
tine20/HumanResources/translations/es_MX.po
tine20/HumanResources/translations/et.po
tine20/HumanResources/translations/fa_IR.po
tine20/HumanResources/translations/fi.po
tine20/HumanResources/translations/fr.po
tine20/HumanResources/translations/he.po
tine20/HumanResources/translations/he_IL.po
tine20/HumanResources/translations/hr_HR.po
tine20/HumanResources/translations/hu.po
tine20/HumanResources/translations/it.po
tine20/HumanResources/translations/ja.po
tine20/HumanResources/translations/ja_JP.po
tine20/HumanResources/translations/ko.po
tine20/HumanResources/translations/ko_KR.po
tine20/HumanResources/translations/lt.po
tine20/HumanResources/translations/nb.po
tine20/HumanResources/translations/nl_NL.po
tine20/HumanResources/translations/pl.po
tine20/HumanResources/translations/pt_BR.po
tine20/HumanResources/translations/ro_RO.po
tine20/HumanResources/translations/ru.po
tine20/HumanResources/translations/sk.po
tine20/HumanResources/translations/sl.po
tine20/HumanResources/translations/sq.po
tine20/HumanResources/translations/sv_SE.po
tine20/HumanResources/translations/template.pot
tine20/HumanResources/translations/th.po
tine20/HumanResources/translations/tr_TR.po
tine20/HumanResources/translations/vi.po
tine20/HumanResources/translations/vi_VN.po
tine20/HumanResources/translations/zh_CN.po
tine20/HumanResources/translations/zh_TW.po
tine20/Inventory/Model/InventoryItem.php
tine20/Inventory/Setup/Update/Release10.php
tine20/Inventory/Setup/setup.xml
tine20/Inventory/translations/bg.po
tine20/Inventory/translations/ca.po
tine20/Inventory/translations/cs.po
tine20/Inventory/translations/cs_CZ.po
tine20/Inventory/translations/da.po
tine20/Inventory/translations/de.po
tine20/Inventory/translations/el_GR.po
tine20/Inventory/translations/en.po
tine20/Inventory/translations/en_AU.po
tine20/Inventory/translations/en_NZ.po
tine20/Inventory/translations/es.po
tine20/Inventory/translations/es_MX.po
tine20/Inventory/translations/et.po
tine20/Inventory/translations/fa_IR.po
tine20/Inventory/translations/fi.po
tine20/Inventory/translations/fr.po
tine20/Inventory/translations/he.po
tine20/Inventory/translations/he_IL.po
tine20/Inventory/translations/hr_HR.po
tine20/Inventory/translations/hu.po
tine20/Inventory/translations/it.po
tine20/Inventory/translations/ja.po
tine20/Inventory/translations/ja_JP.po
tine20/Inventory/translations/ko.po
tine20/Inventory/translations/ko_KR.po
tine20/Inventory/translations/lt.po
tine20/Inventory/translations/nb.po
tine20/Inventory/translations/nl_NL.po
tine20/Inventory/translations/pl.po
tine20/Inventory/translations/pt_BR.po
tine20/Inventory/translations/ro_RO.po
tine20/Inventory/translations/ru.po
tine20/Inventory/translations/sk.po
tine20/Inventory/translations/sl.po
tine20/Inventory/translations/sq.po
tine20/Inventory/translations/sv_SE.po
tine20/Inventory/translations/template.pot
tine20/Inventory/translations/th.po
tine20/Inventory/translations/tr_TR.po
tine20/Inventory/translations/vi.po
tine20/Inventory/translations/vi_VN.po
tine20/Inventory/translations/zh_CN.po
tine20/Inventory/translations/zh_TW.po
tine20/MailFiler/js/NodeTreePanel.js
tine20/MailFiler/js/nodeActions.js
tine20/MailFiler/translations/bg.po [new file with mode: 0644]
tine20/MailFiler/translations/ca.po [new file with mode: 0644]
tine20/MailFiler/translations/cs.po [new file with mode: 0644]
tine20/MailFiler/translations/cs_CZ.po [new file with mode: 0644]
tine20/MailFiler/translations/da.po [new file with mode: 0644]
tine20/MailFiler/translations/de.po
tine20/MailFiler/translations/el_GR.po [new file with mode: 0644]
tine20/MailFiler/translations/en.po
tine20/MailFiler/translations/en_AU.po [new file with mode: 0644]
tine20/MailFiler/translations/en_NZ.po [new file with mode: 0644]
tine20/MailFiler/translations/es.po [new file with mode: 0644]
tine20/MailFiler/translations/es_MX.po [new file with mode: 0644]
tine20/MailFiler/translations/et.po [new file with mode: 0644]
tine20/MailFiler/translations/fa_IR.po [new file with mode: 0644]
tine20/MailFiler/translations/fi.po [new file with mode: 0644]
tine20/MailFiler/translations/fr.po [new file with mode: 0644]
tine20/MailFiler/translations/he.po [new file with mode: 0644]
tine20/MailFiler/translations/he_IL.po [new file with mode: 0644]
tine20/MailFiler/translations/hr_HR.po [new file with mode: 0644]
tine20/MailFiler/translations/hu.po [new file with mode: 0644]
tine20/MailFiler/translations/it.po [new file with mode: 0644]
tine20/MailFiler/translations/ja.po [new file with mode: 0644]
tine20/MailFiler/translations/ja_JP.po [new file with mode: 0644]
tine20/MailFiler/translations/ko.po [new file with mode: 0644]
tine20/MailFiler/translations/ko_KR.po [new file with mode: 0644]
tine20/MailFiler/translations/lt.po [new file with mode: 0644]
tine20/MailFiler/translations/nb.po [new file with mode: 0644]
tine20/MailFiler/translations/nl_NL.po [new file with mode: 0644]
tine20/MailFiler/translations/pl.po [new file with mode: 0644]
tine20/MailFiler/translations/pt_BR.po [new file with mode: 0644]
tine20/MailFiler/translations/ro_RO.po [new file with mode: 0644]
tine20/MailFiler/translations/ru.po [new file with mode: 0644]
tine20/MailFiler/translations/sk.po [new file with mode: 0644]
tine20/MailFiler/translations/sl.po [new file with mode: 0644]
tine20/MailFiler/translations/sq.po [new file with mode: 0644]
tine20/MailFiler/translations/sv_SE.po [new file with mode: 0644]
tine20/MailFiler/translations/template.pot
tine20/MailFiler/translations/th.po [new file with mode: 0644]
tine20/MailFiler/translations/tr_TR.po [new file with mode: 0644]
tine20/MailFiler/translations/vi.po [new file with mode: 0644]
tine20/MailFiler/translations/vi_VN.po [new file with mode: 0644]
tine20/MailFiler/translations/zh_CN.po [new file with mode: 0644]
tine20/MailFiler/translations/zh_TW.po [new file with mode: 0644]
tine20/Phone/js/PhoneTreePanel.js
tine20/Phone/translations/bg.po
tine20/Phone/translations/ca.po
tine20/Phone/translations/cs.po
tine20/Phone/translations/cs_CZ.po
tine20/Phone/translations/da.po
tine20/Phone/translations/de.po
tine20/Phone/translations/el_GR.po
tine20/Phone/translations/en.po
tine20/Phone/translations/en_AU.po
tine20/Phone/translations/en_NZ.po
tine20/Phone/translations/es.po
tine20/Phone/translations/es_MX.po
tine20/Phone/translations/et.po
tine20/Phone/translations/fa_IR.po
tine20/Phone/translations/fi.po
tine20/Phone/translations/fr.po
tine20/Phone/translations/he.po
tine20/Phone/translations/he_IL.po
tine20/Phone/translations/hr_HR.po
tine20/Phone/translations/hu.po
tine20/Phone/translations/it.po
tine20/Phone/translations/ja.po
tine20/Phone/translations/ja_JP.po
tine20/Phone/translations/ko.po
tine20/Phone/translations/ko_KR.po
tine20/Phone/translations/lt.po
tine20/Phone/translations/nb.po
tine20/Phone/translations/nl_NL.po
tine20/Phone/translations/pl.po
tine20/Phone/translations/pt_BR.po
tine20/Phone/translations/ro_RO.po
tine20/Phone/translations/ru.po
tine20/Phone/translations/sk.po
tine20/Phone/translations/sl.po
tine20/Phone/translations/sq.po
tine20/Phone/translations/sv_SE.po
tine20/Phone/translations/template.pot
tine20/Phone/translations/th.po
tine20/Phone/translations/tr_TR.po
tine20/Phone/translations/vi.po
tine20/Phone/translations/vi_VN.po
tine20/Phone/translations/zh_CN.po
tine20/Phone/translations/zh_TW.po
tine20/Projects/Setup/Update/Release10.php
tine20/Projects/Setup/setup.xml
tine20/Projects/js/ProjectEditDialog.js
tine20/Projects/translations/bg.po
tine20/Projects/translations/ca.po
tine20/Projects/translations/cs.po
tine20/Projects/translations/cs_CZ.po
tine20/Projects/translations/da.po
tine20/Projects/translations/de.po
tine20/Projects/translations/el_GR.po
tine20/Projects/translations/en.po
tine20/Projects/translations/en_AU.po
tine20/Projects/translations/en_NZ.po
tine20/Projects/translations/es.po
tine20/Projects/translations/es_MX.po
tine20/Projects/translations/et.po
tine20/Projects/translations/fa_IR.po
tine20/Projects/translations/fi.po
tine20/Projects/translations/fr.po
tine20/Projects/translations/he.po
tine20/Projects/translations/he_IL.po
tine20/Projects/translations/hr_HR.po
tine20/Projects/translations/hu.po
tine20/Projects/translations/it.po
tine20/Projects/translations/ja.po
tine20/Projects/translations/ja_JP.po
tine20/Projects/translations/ko.po
tine20/Projects/translations/ko_KR.po
tine20/Projects/translations/lt.po
tine20/Projects/translations/nb.po
tine20/Projects/translations/nl_NL.po
tine20/Projects/translations/pl.po
tine20/Projects/translations/pt_BR.po
tine20/Projects/translations/ro_RO.po
tine20/Projects/translations/ru.po
tine20/Projects/translations/sk.po
tine20/Projects/translations/sl.po
tine20/Projects/translations/sq.po
tine20/Projects/translations/sv_SE.po
tine20/Projects/translations/template.pot
tine20/Projects/translations/th.po
tine20/Projects/translations/tr_TR.po
tine20/Projects/translations/vi.po
tine20/Projects/translations/vi_VN.po
tine20/Projects/translations/zh_CN.po
tine20/Projects/translations/zh_TW.po
tine20/RELEASENOTES
tine20/Sales/Controller/Customer.php
tine20/Sales/Controller/Invoice.php
tine20/Sales/Controller/Product.php
tine20/Sales/Controller/PurchaseInvoice.php
tine20/Sales/Controller/Supplier.php
tine20/Sales/Setup/Update/Release10.php
tine20/Sales/Setup/setup.xml
tine20/Sales/translations/bg.po
tine20/Sales/translations/ca.po
tine20/Sales/translations/cs.po
tine20/Sales/translations/cs_CZ.po
tine20/Sales/translations/da.po
tine20/Sales/translations/de.po
tine20/Sales/translations/el_GR.po
tine20/Sales/translations/en.po
tine20/Sales/translations/en_AU.po
tine20/Sales/translations/en_NZ.po
tine20/Sales/translations/es.po
tine20/Sales/translations/es_MX.po
tine20/Sales/translations/et.po
tine20/Sales/translations/fa_IR.po
tine20/Sales/translations/fi.po
tine20/Sales/translations/fr.po
tine20/Sales/translations/he.po
tine20/Sales/translations/he_IL.po
tine20/Sales/translations/hr_HR.po
tine20/Sales/translations/hu.po
tine20/Sales/translations/it.po
tine20/Sales/translations/ja.po
tine20/Sales/translations/ja_JP.po
tine20/Sales/translations/ko.po
tine20/Sales/translations/ko_KR.po
tine20/Sales/translations/lt.po
tine20/Sales/translations/nb.po
tine20/Sales/translations/nl_NL.po
tine20/Sales/translations/pl.po
tine20/Sales/translations/pt_BR.po
tine20/Sales/translations/ro_RO.po
tine20/Sales/translations/ru.po
tine20/Sales/translations/sk.po
tine20/Sales/translations/sl.po
tine20/Sales/translations/sq.po
tine20/Sales/translations/sv_SE.po
tine20/Sales/translations/template.pot
tine20/Sales/translations/th.po
tine20/Sales/translations/tr_TR.po
tine20/Sales/translations/vi.po
tine20/Sales/translations/vi_VN.po
tine20/Sales/translations/zh_CN.po
tine20/Sales/translations/zh_TW.po
tine20/Setup/Backend/Abstract.php
tine20/Setup/Backend/Mysql.php
tine20/Setup/Backend/Pgsql.php
tine20/Setup/Backend/Schema/Field/Xml.php
tine20/Setup/Controller.php
tine20/Setup/Frontend/Cli.php
tine20/Setup/Initialize.php
tine20/Setup/Server/Cli.php
tine20/Setup/translations/bg.po
tine20/Setup/translations/ca.po
tine20/Setup/translations/cs.po
tine20/Setup/translations/cs_CZ.po
tine20/Setup/translations/da.po
tine20/Setup/translations/de.po
tine20/Setup/translations/el_GR.po
tine20/Setup/translations/en.po
tine20/Setup/translations/en_AU.po
tine20/Setup/translations/en_NZ.po
tine20/Setup/translations/es.po
tine20/Setup/translations/es_MX.po
tine20/Setup/translations/et.po
tine20/Setup/translations/fa_IR.po
tine20/Setup/translations/fi.po
tine20/Setup/translations/fr.po
tine20/Setup/translations/he.po
tine20/Setup/translations/he_IL.po
tine20/Setup/translations/hr_HR.po
tine20/Setup/translations/hu.po
tine20/Setup/translations/it.po
tine20/Setup/translations/ja.po
tine20/Setup/translations/ja_JP.po
tine20/Setup/translations/ko.po
tine20/Setup/translations/ko_KR.po
tine20/Setup/translations/lt.po
tine20/Setup/translations/nb.po
tine20/Setup/translations/nl_NL.po
tine20/Setup/translations/pl.po
tine20/Setup/translations/pt_BR.po
tine20/Setup/translations/ro_RO.po
tine20/Setup/translations/ru.po
tine20/Setup/translations/sk.po
tine20/Setup/translations/sl.po
tine20/Setup/translations/sq.po
tine20/Setup/translations/sv_SE.po
tine20/Setup/translations/template.pot
tine20/Setup/translations/th.po
tine20/Setup/translations/tr_TR.po
tine20/Setup/translations/vi.po
tine20/Setup/translations/vi_VN.po
tine20/Setup/translations/zh_CN.po
tine20/Setup/translations/zh_TW.po
tine20/SimpleFAQ/Setup/setup.xml
tine20/SimpleFAQ/translations/bg.po
tine20/SimpleFAQ/translations/ca.po
tine20/SimpleFAQ/translations/cs.po
tine20/SimpleFAQ/translations/cs_CZ.po
tine20/SimpleFAQ/translations/da.po
tine20/SimpleFAQ/translations/de.po
tine20/SimpleFAQ/translations/el_GR.po
tine20/SimpleFAQ/translations/en.po
tine20/SimpleFAQ/translations/en_AU.po
tine20/SimpleFAQ/translations/en_NZ.po
tine20/SimpleFAQ/translations/es.po
tine20/SimpleFAQ/translations/es_MX.po
tine20/SimpleFAQ/translations/et.po
tine20/SimpleFAQ/translations/fa_IR.po
tine20/SimpleFAQ/translations/fi.po
tine20/SimpleFAQ/translations/fr.po
tine20/SimpleFAQ/translations/he.po
tine20/SimpleFAQ/translations/he_IL.po
tine20/SimpleFAQ/translations/hr_HR.po
tine20/SimpleFAQ/translations/hu.po
tine20/SimpleFAQ/translations/it.po
tine20/SimpleFAQ/translations/ja.po
tine20/SimpleFAQ/translations/ja_JP.po
tine20/SimpleFAQ/translations/ko.po
tine20/SimpleFAQ/translations/ko_KR.po
tine20/SimpleFAQ/translations/lt.po
tine20/SimpleFAQ/translations/nb.po
tine20/SimpleFAQ/translations/nl_NL.po
tine20/SimpleFAQ/translations/pl.po
tine20/SimpleFAQ/translations/pt_BR.po
tine20/SimpleFAQ/translations/ro_RO.po
tine20/SimpleFAQ/translations/ru.po
tine20/SimpleFAQ/translations/sk.po
tine20/SimpleFAQ/translations/sl.po
tine20/SimpleFAQ/translations/sq.po
tine20/SimpleFAQ/translations/sv_SE.po
tine20/SimpleFAQ/translations/template.pot
tine20/SimpleFAQ/translations/th.po
tine20/SimpleFAQ/translations/tr_TR.po
tine20/SimpleFAQ/translations/vi.po
tine20/SimpleFAQ/translations/vi_VN.po
tine20/SimpleFAQ/translations/zh_CN.po
tine20/SimpleFAQ/translations/zh_TW.po
tine20/Tasks/Model/Task.php
tine20/Tasks/Setup/Update/Release10.php
tine20/Tasks/Setup/setup.xml
tine20/Tasks/translations/bg.po
tine20/Tasks/translations/ca.po
tine20/Tasks/translations/cs.po
tine20/Tasks/translations/cs_CZ.po
tine20/Tasks/translations/da.po
tine20/Tasks/translations/de.po
tine20/Tasks/translations/el_GR.po
tine20/Tasks/translations/en.po
tine20/Tasks/translations/en_AU.po
tine20/Tasks/translations/en_NZ.po
tine20/Tasks/translations/es.po
tine20/Tasks/translations/es_MX.po
tine20/Tasks/translations/et.po
tine20/Tasks/translations/fa_IR.po
tine20/Tasks/translations/fi.po
tine20/Tasks/translations/fr.po
tine20/Tasks/translations/he.po
tine20/Tasks/translations/he_IL.po
tine20/Tasks/translations/hr_HR.po
tine20/Tasks/translations/hu.po
tine20/Tasks/translations/it.po
tine20/Tasks/translations/ja.po
tine20/Tasks/translations/ja_JP.po
tine20/Tasks/translations/ko.po
tine20/Tasks/translations/ko_KR.po
tine20/Tasks/translations/lt.po
tine20/Tasks/translations/nb.po
tine20/Tasks/translations/nl_NL.po
tine20/Tasks/translations/pl.po
tine20/Tasks/translations/pt_BR.po
tine20/Tasks/translations/ro_RO.po
tine20/Tasks/translations/ru.po
tine20/Tasks/translations/sk.po
tine20/Tasks/translations/sl.po
tine20/Tasks/translations/sq.po
tine20/Tasks/translations/sv_SE.po
tine20/Tasks/translations/template.pot
tine20/Tasks/translations/th.po
tine20/Tasks/translations/tr_TR.po
tine20/Tasks/translations/vi.po
tine20/Tasks/translations/vi_VN.po
tine20/Tasks/translations/zh_CN.po
tine20/Tasks/translations/zh_TW.po
tine20/Timetracker/Controller/Timeaccount.php
tine20/Timetracker/Model/Timeaccount.php
tine20/Timetracker/Setup/Update/Release10.php
tine20/Timetracker/Setup/setup.xml
tine20/Timetracker/js/DurationSpinner.js
tine20/Timetracker/js/TimeaccountEditDialog.js
tine20/Timetracker/js/TimesheetEditDialog.js
tine20/Timetracker/translations/bg.po
tine20/Timetracker/translations/ca.po
tine20/Timetracker/translations/cs.po
tine20/Timetracker/translations/cs_CZ.po
tine20/Timetracker/translations/da.po
tine20/Timetracker/translations/de.po
tine20/Timetracker/translations/el_GR.po
tine20/Timetracker/translations/en.po
tine20/Timetracker/translations/en_AU.po
tine20/Timetracker/translations/en_NZ.po
tine20/Timetracker/translations/es.po
tine20/Timetracker/translations/es_MX.po
tine20/Timetracker/translations/et.po
tine20/Timetracker/translations/fa_IR.po
tine20/Timetracker/translations/fi.po
tine20/Timetracker/translations/fr.po
tine20/Timetracker/translations/he.po
tine20/Timetracker/translations/he_IL.po
tine20/Timetracker/translations/hr_HR.po
tine20/Timetracker/translations/hu.po
tine20/Timetracker/translations/it.po
tine20/Timetracker/translations/ja.po
tine20/Timetracker/translations/ja_JP.po
tine20/Timetracker/translations/ko.po
tine20/Timetracker/translations/ko_KR.po
tine20/Timetracker/translations/lt.po
tine20/Timetracker/translations/nb.po
tine20/Timetracker/translations/nl_NL.po
tine20/Timetracker/translations/pl.po
tine20/Timetracker/translations/pt_BR.po
tine20/Timetracker/translations/ro_RO.po
tine20/Timetracker/translations/ru.po
tine20/Timetracker/translations/sk.po
tine20/Timetracker/translations/sl.po
tine20/Timetracker/translations/sq.po
tine20/Timetracker/translations/sv_SE.po
tine20/Timetracker/translations/template.pot
tine20/Timetracker/translations/th.po
tine20/Timetracker/translations/tr_TR.po
tine20/Timetracker/translations/vi.po
tine20/Timetracker/translations/vi_VN.po
tine20/Timetracker/translations/zh_CN.po
tine20/Timetracker/translations/zh_TW.po
tine20/Tinebase/AccessLog.php
tine20/Tinebase/Acl/Roles.php
tine20/Tinebase/ActionQueue/Backend/Redis.php
tine20/Tinebase/ActionQueue/Worker.php
tine20/Tinebase/Application.php
tine20/Tinebase/Auth.php
tine20/Tinebase/Auth/SecondFactor/Abstract.php
tine20/Tinebase/Auth/SecondFactor/PrivacyIdea.php
tine20/Tinebase/Auth/SecondFactor/Tine20.php [new file with mode: 0644]
tine20/Tinebase/Backend/Sql/Abstract.php
tine20/Tinebase/Backend/Sql/Command/Interface.php
tine20/Tinebase/Backend/Sql/Command/Mysql.php
tine20/Tinebase/Backend/Sql/Command/Oracle.php
tine20/Tinebase/Backend/Sql/Command/Pgsql.php
tine20/Tinebase/Config.php
tine20/Tinebase/Config/Abstract.php
tine20/Tinebase/Container.php
tine20/Tinebase/Controller.php
tine20/Tinebase/Controller/Record/Abstract.php
tine20/Tinebase/Controller/Record/Grants.php
tine20/Tinebase/Controller/Record/ModlogTrait.php
tine20/Tinebase/Convert/FullUser/Json.php [new file with mode: 0644]
tine20/Tinebase/Core.php
tine20/Tinebase/CustomField.php
tine20/Tinebase/DummyController.php [new file with mode: 0644]
tine20/Tinebase/EmailUser/Imap/Dovecot.php
tine20/Tinebase/EmailUser/Smtp/Postfix.php
tine20/Tinebase/EmailUser/Sql.php
tine20/Tinebase/Exception/SecondFactorRequired.php [new file with mode: 0644]
tine20/Tinebase/Export/Abstract.php
tine20/Tinebase/Export/Doc.php
tine20/Tinebase/Export/Richtext/TemplateProcessor.php
tine20/Tinebase/Export/Xls.php
tine20/Tinebase/FileSystem.php
tine20/Tinebase/FileSystem/RecordAttachments.php
tine20/Tinebase/Frontend/Cli.php
tine20/Tinebase/Frontend/Http.php
tine20/Tinebase/Frontend/Json.php
tine20/Tinebase/Frontend/WebDAV/Container.php
tine20/Tinebase/Import/Abstract.php
tine20/Tinebase/Import/Csv/Abstract.php
tine20/Tinebase/Import/Xls/Abstract.php [new file with mode: 0644]
tine20/Tinebase/Import/Xls/Generic.php [new file with mode: 0644]
tine20/Tinebase/Model/Application.php
tine20/Tinebase/Model/Container.php
tine20/Tinebase/Model/CustomField/Config.php
tine20/Tinebase/Model/Filter/Abstract.php
tine20/Tinebase/Model/Filter/CustomField.php
tine20/Tinebase/Model/Filter/ExplicitRelatedRecord.php
tine20/Tinebase/Model/Filter/FilterGroup.php
tine20/Tinebase/Model/Filter/ForeignRecord.php
tine20/Tinebase/Model/Filter/Id.php
tine20/Tinebase/Model/Filter/Relation.php
tine20/Tinebase/Model/Filter/Text.php
tine20/Tinebase/Model/FullUser.php
tine20/Tinebase/Model/Grants.php
tine20/Tinebase/Model/ModificationLogFilter.php
tine20/Tinebase/Model/PersistentObserver.php
tine20/Tinebase/Model/Tree/FileObject.php
tine20/Tinebase/Model/Tree/FileObjectFilter.php
tine20/Tinebase/Model/Tree/Node.php
tine20/Tinebase/Model/Tree/Node/Filter.php
tine20/Tinebase/Model/Tree/Node/PathFilter.php
tine20/Tinebase/ModelConfiguration.php
tine20/Tinebase/Notes.php
tine20/Tinebase/Record/Abstract.php
tine20/Tinebase/Record/DoctrineMappingDriver.php
tine20/Tinebase/Record/Interface.php
tine20/Tinebase/Record/PersistentObserver.php
tine20/Tinebase/Record/RecordSet.php
tine20/Tinebase/Relation/Backend/Sql.php
tine20/Tinebase/Relations.php
tine20/Tinebase/Scheduler/Task.php
tine20/Tinebase/Server/Abstract.php
tine20/Tinebase/Server/WebDAV.php
tine20/Tinebase/Setup/Initialize.php
tine20/Tinebase/Setup/Update/Release10.php
tine20/Tinebase/Setup/setup.xml
tine20/Tinebase/Timemachine/ModificationLog.php
tine20/Tinebase/Tinebase.jsb2
tine20/Tinebase/Translation.php
tine20/Tinebase/Tree.php
tine20/Tinebase/Tree/FileObject.php
tine20/Tinebase/Tree/Node.php
tine20/Tinebase/User.php
tine20/Tinebase/User/Abstract.php
tine20/Tinebase/User/Plugin/Abstract.php
tine20/Tinebase/User/Plugin/LdapAbstract.php
tine20/Tinebase/User/Sql.php
tine20/Tinebase/css/Tinebase.css
tine20/Tinebase/css/ux/display/DisplayPanel.css
tine20/Tinebase/css/ux/form/PeriodPicker.css [new file with mode: 0644]
tine20/Tinebase/css/widgets/print.css [moved from tine20/Tinebase/css/widgets/RecordPrinter.css with 99% similarity]
tine20/Tinebase/js/AppTabsPanel.js
tine20/Tinebase/js/ApplicationStarter.js
tine20/Tinebase/js/CanonicalPath.js
tine20/Tinebase/js/Container.js
tine20/Tinebase/js/ExceptionDialog.js
tine20/Tinebase/js/ExceptionHandler.js
tine20/Tinebase/js/LoginPanel.js
tine20/Tinebase/js/MainMenu.js
tine20/Tinebase/js/Models.js
tine20/Tinebase/js/PasswordChangeDialog.js
tine20/Tinebase/js/PresenceObserver.js
tine20/Tinebase/js/data/Record.js
tine20/Tinebase/js/data/RecordProxy.js
tine20/Tinebase/js/extFixes.js
tine20/Tinebase/js/tineInit.js
tine20/Tinebase/js/ux/ItemRegistry.js
tine20/Tinebase/js/ux/Printer/renderers/Base.js
tine20/Tinebase/js/ux/Printer/renderers/EditDialogRenderer.js [new file with mode: 0644]
tine20/Tinebase/js/ux/WindowFactory.js
tine20/Tinebase/js/ux/form/ClearableComboBox.js
tine20/Tinebase/js/ux/form/ImageField.js
tine20/Tinebase/js/ux/form/LayerCombo.js
tine20/Tinebase/js/ux/form/MoneyField.js
tine20/Tinebase/js/ux/form/PeriodPicker.js [new file with mode: 0644]
tine20/Tinebase/js/ux/grid/MultiCellSelectionModel.js [new file with mode: 0644]
tine20/Tinebase/js/webpack.config.js
tine20/Tinebase/js/widgets/ActionUpdater.js
tine20/Tinebase/js/widgets/ActivitiesGridPanel.js
tine20/Tinebase/js/widgets/ActivitiesPanel.js
tine20/Tinebase/js/widgets/ContentTypeTreePanel.js
tine20/Tinebase/js/widgets/MainScreen.js
tine20/Tinebase/js/widgets/container/TreePanel.js
tine20/Tinebase/js/widgets/customfields/Field.js
tine20/Tinebase/js/widgets/dialog/AttachmentsGridPanel.js
tine20/Tinebase/js/widgets/dialog/EditDialog.js
tine20/Tinebase/js/widgets/dialog/ImportDialog.js
tine20/Tinebase/js/widgets/dialog/PasswordDialog.js
tine20/Tinebase/js/widgets/dialog/SecondFactorDialog.js [new file with mode: 0644]
tine20/Tinebase/js/widgets/display/RecordDisplayPanel.js
tine20/Tinebase/js/widgets/exportAction.js
tine20/Tinebase/js/widgets/form/FieldManager.js
tine20/Tinebase/js/widgets/form/RecordPickerComboBox.js
tine20/Tinebase/js/widgets/form/RecordsPickerCombo.js [new file with mode: 0644]
tine20/Tinebase/js/widgets/grid/FileUploadGrid.js
tine20/Tinebase/js/widgets/grid/FilterStructureTreePanel.js
tine20/Tinebase/js/widgets/grid/ForeignRecordFilter.js
tine20/Tinebase/js/widgets/grid/GridPanel.js
tine20/Tinebase/js/widgets/grid/LinkGridPanel.js
tine20/Tinebase/js/widgets/grid/PickerGridLayerCombo.js
tine20/Tinebase/js/widgets/keyfield/ComboBox.js
tine20/Tinebase/js/widgets/path/renderer.js
tine20/Tinebase/js/widgets/persistentfilter/PickerPanel.js
tine20/Tinebase/js/widgets/relation/GenericPickerGridPanel.js
tine20/Tinebase/js/widgets/relation/PickerCombo.js
tine20/Tinebase/js/widgets/tags/TagsPanel.js
tine20/Tinebase/js/widgets/tree/Loader.js
tine20/Tinebase/translations/bg.po
tine20/Tinebase/translations/ca.po
tine20/Tinebase/translations/cs.po
tine20/Tinebase/translations/cs_CZ.po
tine20/Tinebase/translations/da.po
tine20/Tinebase/translations/de.po
tine20/Tinebase/translations/el_GR.po
tine20/Tinebase/translations/en.po
tine20/Tinebase/translations/en_AU.po
tine20/Tinebase/translations/en_NZ.po
tine20/Tinebase/translations/es.po
tine20/Tinebase/translations/es_MX.po
tine20/Tinebase/translations/et.po
tine20/Tinebase/translations/fa_IR.po
tine20/Tinebase/translations/fi.po
tine20/Tinebase/translations/fr.po
tine20/Tinebase/translations/he.po
tine20/Tinebase/translations/he_IL.po
tine20/Tinebase/translations/hr_HR.po
tine20/Tinebase/translations/hu.po
tine20/Tinebase/translations/it.po
tine20/Tinebase/translations/ja.po
tine20/Tinebase/translations/ja_JP.po
tine20/Tinebase/translations/ko.po
tine20/Tinebase/translations/ko_KR.po
tine20/Tinebase/translations/lt.po
tine20/Tinebase/translations/nb.po
tine20/Tinebase/translations/nl_NL.po
tine20/Tinebase/translations/pl.po
tine20/Tinebase/translations/pt_BR.po
tine20/Tinebase/translations/ro_RO.po
tine20/Tinebase/translations/ru.po
tine20/Tinebase/translations/sk.po
tine20/Tinebase/translations/sl.po
tine20/Tinebase/translations/sq.po
tine20/Tinebase/translations/sv_SE.po
tine20/Tinebase/translations/template.pot
tine20/Tinebase/translations/th.po
tine20/Tinebase/translations/tr_TR.po
tine20/Tinebase/translations/vi.po
tine20/Tinebase/translations/vi_VN.po
tine20/Tinebase/translations/zh_CN.po
tine20/Tinebase/translations/zh_TW.po
tine20/Voipmanager/translations/bg.po
tine20/Voipmanager/translations/ca.po
tine20/Voipmanager/translations/cs.po
tine20/Voipmanager/translations/cs_CZ.po
tine20/Voipmanager/translations/da.po
tine20/Voipmanager/translations/de.po
tine20/Voipmanager/translations/el_GR.po
tine20/Voipmanager/translations/en.po
tine20/Voipmanager/translations/en_AU.po
tine20/Voipmanager/translations/en_NZ.po
tine20/Voipmanager/translations/es.po
tine20/Voipmanager/translations/es_MX.po
tine20/Voipmanager/translations/et.po
tine20/Voipmanager/translations/fa_IR.po
tine20/Voipmanager/translations/fi.po
tine20/Voipmanager/translations/fr.po
tine20/Voipmanager/translations/he.po
tine20/Voipmanager/translations/he_IL.po
tine20/Voipmanager/translations/hr_HR.po
tine20/Voipmanager/translations/hu.po
tine20/Voipmanager/translations/it.po
tine20/Voipmanager/translations/ja.po
tine20/Voipmanager/translations/ja_JP.po
tine20/Voipmanager/translations/ko.po
tine20/Voipmanager/translations/ko_KR.po
tine20/Voipmanager/translations/lt.po
tine20/Voipmanager/translations/nb.po
tine20/Voipmanager/translations/nl_NL.po
tine20/Voipmanager/translations/pl.po
tine20/Voipmanager/translations/pt_BR.po
tine20/Voipmanager/translations/ro_RO.po
tine20/Voipmanager/translations/ru.po
tine20/Voipmanager/translations/sk.po
tine20/Voipmanager/translations/sl.po
tine20/Voipmanager/translations/sq.po
tine20/Voipmanager/translations/sv_SE.po
tine20/Voipmanager/translations/template.pot
tine20/Voipmanager/translations/th.po
tine20/Voipmanager/translations/tr_TR.po
tine20/Voipmanager/translations/vi.po
tine20/Voipmanager/translations/vi_VN.po
tine20/Voipmanager/translations/zh_CN.po
tine20/Voipmanager/translations/zh_TW.po
tine20/build.xml
tine20/composer.json
tine20/composer.lock
tine20/library/Console/Daemon.php

index 1524bfd..3250e7c 100644 (file)
@@ -95,4 +95,16 @@ class Setup_CliTest extends TestCase
 (
 )", $result);
     }
+
+    /**
+     * Test setpassword of replicationuser
+     */
+    public function testSetPassword()
+    {
+        $this->testSetConfig();
+        $result = $this->_cliHelper('setpassword', array('--setpassword','--','username=replicationuser', 'password=xxxx1234'));
+        self::assertEmpty($result);
+        $auth = Tinebase_Auth::getInstance()->authenticate('replicationuser', 'xxxx1234');
+        self::assertTrue($auth->isValid(), print_r($auth, true));
+    }
 }
index c5d51a9..c70b8c8 100644 (file)
@@ -331,6 +331,7 @@ class Setup_ControllerTest extends PHPUnit_Framework_TestCase
         Tinebase_Acl_Roles::unsetInstance();
         Tinebase_Core::unsetUser();
         Tinebase_Cache_PerRequest::getInstance()->reset();
+        Admin_Config::unsetInstance();
     }
     
     /**
@@ -348,6 +349,7 @@ class Setup_ControllerTest extends PHPUnit_Framework_TestCase
         Tinebase_Core::unsetTinebaseId();
         Tinebase_Group::unsetInstance();
         Tinebase_Cache_PerRequest::getInstance()->reset();
+        Admin_Config::unsetInstance();
         $installableApplications = $this->_uit->getInstallableApplications();
         $installableApplications = array_keys($installableApplications);
         $this->_uit->installApplications($installableApplications, $_options);
index 9679673..2a9d80c 100644 (file)
@@ -299,6 +299,7 @@ class Setup_JsonTest extends PHPUnit_Framework_TestCase
         Tinebase_Core::unsetTinebaseId();
         Tinebase_Group::unsetInstance();
         Tinebase_Cache_PerRequest::getInstance()->reset();
+        Admin_Config::unsetInstance();
     }
     
     /**
@@ -309,6 +310,7 @@ class Setup_JsonTest extends PHPUnit_Framework_TestCase
         Tinebase_Core::unsetTinebaseId();
         Tinebase_Group::unsetInstance();
         Tinebase_Cache_PerRequest::getInstance()->reset();
+        Admin_Config::unsetInstance();
 
         $installableApplications = Setup_Controller::getInstance()->getInstallableApplications();
         $installableApplications = array_keys($installableApplications);
index 8489813..56d090f 100644 (file)
@@ -376,6 +376,19 @@ class Addressbook_Backend_SqlTest extends PHPUnit_Framework_TestCase
         ));
         return $contact;
     }
+
+    /**
+     * testIncreaseSeqForContainerId
+     */
+    public function testIncreaseSeqsForContainerId()
+    {
+        $contact = $this->testCreateContact();
+        $this->_backend->increaseSeqsForContainerId($contact->container_id);
+
+        $updatedConcact = $this->_backend->get($contact->getId());
+
+        $this->assertEquals($contact->seq + 1, $updatedConcact->seq);
+    }
 }        
 
 if (PHPUnit_MAIN_METHOD == 'Addressbook_Backend_SqlTest::main') {
index 0227e8d..6a78557 100644 (file)
@@ -40,6 +40,8 @@ class Addressbook_ControllerTest extends TestCase
         parent::setUp();
         $this->_instance = Addressbook_Controller_Contact::getInstance();
 
+        $this->_oldFileSystemConfig = clone Tinebase_Config::getInstance()->{Tinebase_Config::FILESYSTEM};
+
         $personalContainer = Tinebase_Container::getInstance()->getPersonalContainer(
             Zend_Registry::get('currentAccount'), 
             'Addressbook', 
@@ -154,6 +156,8 @@ class Addressbook_ControllerTest extends TestCase
             $this->_instance->delete($this->objects['contact']);
         }
 
+        Tinebase_Config::getInstance()->{Tinebase_Config::FILESYSTEM} = $this->_oldFileSystemConfig;
+
         parent::tearDown();
     }
     
@@ -165,7 +169,7 @@ class Addressbook_ControllerTest extends TestCase
     protected function _addContact()
     {
         $contact = $this->objects['initialContact'];
-        $contact->notes = new Tinebase_Record_RecordSet('Tinebase_Model_Note', array($this->objects['note']));
+        $contact->notes = array($this->objects['note']);
         $contact = $this->_instance->create($contact);
         $this->objects['contact'] = $contact;
         
@@ -501,4 +505,137 @@ class Addressbook_ControllerTest extends TestCase
 
         $this->assertTrue(Addressbook_Config::getInstance()->featureEnabled(Addressbook_Config::FEATURE_LIST_VIEW));
     }
+
+    public function testModLogUndo()
+    {
+        // activate ModLog in FileSystem!
+        Tinebase_Config::getInstance()->{Tinebase_Config::FILESYSTEM}
+            ->{Tinebase_Config::FILESYSTEM_MODLOGACTIVE} = true;
+        $filesystem = Tinebase_FileSystem::getInstance();
+        $filesystem->resetBackends();
+        Tinebase_Core::clearAppInstanceCache();
+
+        $cField1 = Tinebase_CustomField::getInstance()->addCustomField(new Tinebase_Model_CustomField_Config(array(
+            'application_id'    => Tinebase_Application::getInstance()->getApplicationByName('Addressbook')->getId(),
+            'name'              => Tinebase_Record_Abstract::generateUID(),
+            'model'             => 'Addressbook_Model_Contact',
+            'definition'        => array(
+                'label' => Tinebase_Record_Abstract::generateUID(),
+                'type'  => 'string',
+                'uiconfig' => array(
+                    'xtype'  => Tinebase_Record_Abstract::generateUID(),
+                    'length' => 10,
+                    'group'  => 'unittest',
+                    'order'  => 100,
+                )
+            )
+        )));
+        $cField2 = Tinebase_CustomField::getInstance()->addCustomField(new Tinebase_Model_CustomField_Config(array(
+            'application_id'    => Tinebase_Application::getInstance()->getApplicationByName('Addressbook')->getId(),
+            'name'              => Tinebase_Record_Abstract::generateUID(),
+            'model'             => 'Addressbook_Model_Contact',
+            'definition'        => array(
+                'label' => Tinebase_Record_Abstract::generateUID(),
+                'type'  => 'string',
+                'uiconfig' => array(
+                    'xtype'  => Tinebase_Record_Abstract::generateUID(),
+                    'length' => 10,
+                    'group'  => 'unittest',
+                    'order'  => 100,
+                )
+            )
+        )));
+        $user = Tinebase_Core::getUser();
+        /** @var Addressbook_Model_Contact $contact */
+        $contact = $this->objects['initialContact'];
+
+        // create contact with notes, relations, tags, attachments, customfield
+        $contact->notes = array($this->objects['note']);
+        $contact->relations = array(array(
+            'related_id'        => $user->contact_id,
+            'related_model'     => 'Addressbook_Model_Contact',
+            'related_degree'    => Tinebase_Model_Relation::DEGREE_SIBLING,
+            'related_backend'   => Tinebase_Model_Relation::DEFAULT_RECORD_BACKEND,
+            'type'              => 'foo'
+        ));
+        $contact->tags = array(array('name' => 'testtag1'));
+        $path = Tinebase_TempFile::getTempPath();
+        file_put_contents($path, 'testAttachementData');
+        $contact->attachments = new Tinebase_Record_RecordSet('Tinebase_Model_Tree_Node', array(
+            array(
+                'name'      => 'testAttachementData.txt',
+                'tempFile'  => Tinebase_TempFile::getInstance()->createTempFile($path)
+            )
+        ), true);
+        $contact->customfields = array(
+            $cField1->name => 'test field1'
+        );
+
+        $createdContact = $this->_instance->create($contact);
+
+        // update contact, add more notes, relations, tags, attachements, customfields
+        /** @var Addressbook_Model_Contact $updateContact */
+        $updateContact = $this->objects['updatedContact'];
+        $updateContact->setId($createdContact->getId());
+        $notes = $createdContact->notes->toArray();
+        $notes[] = array(
+            'note_type_id'      => 1,
+            'note'              => 'phpunit test note 2',
+        );
+        $updateContact->notes = $notes;
+        $relations = $createdContact->relations->toArray();
+        $relations[] = array(
+            'related_id'        => $user->contact_id,
+            'related_model'     => 'Addressbook_Model_Contact',
+            'related_degree'    => Tinebase_Model_Relation::DEGREE_CHILD,
+            'related_backend'   => Tinebase_Model_Relation::DEFAULT_RECORD_BACKEND,
+            'type'              => 'bar'
+        );
+        $updateContact->relations = $relations;
+        $updateContact->tags = clone $createdContact->tags;
+        $updateContact->tags->addRecord(new Tinebase_Model_Tag(array('name' => 'testtag2'), true));
+        $updateContact->attachments = clone $createdContact->attachments;
+        $path = Tinebase_TempFile::getTempPath();
+        file_put_contents($path, 'moreTestAttachementData');
+        $updateContact->attachments->addRecord(new Tinebase_Model_Tree_Node(array(
+                'name'      => 'moreTestAttachementData.txt',
+                'tempFile'  => Tinebase_TempFile::getInstance()->createTempFile($path)
+        ), true));
+        $updateContact->xprops('customfields')[$cField2->name] = 'test field2';
+
+        $contact = $this->_instance->update($updateContact);
+
+        // delete it
+        $this->_instance->delete($contact->getId());
+
+        $contact->seq = 0;
+        $modifications = Tinebase_Timemachine_ModificationLog::getInstance()->getModificationsBySeq(
+            Tinebase_Application::getInstance()->getApplicationById('Addressbook')->getId(), $contact, 10000);
+
+        // undelete it
+        $mod = $modifications->getLastRecord();
+        $modifications->removeRecord($mod);
+        Tinebase_Timemachine_ModificationLog::getInstance()->undo(new Tinebase_Model_ModificationLogFilter(array(
+            array('field' => 'id', 'operator' => 'in', 'value' => array($mod->getId()))
+        )));
+        $undeletedContact = $this->_instance->get($contact->getId());
+        static::assertEquals(2, $undeletedContact->notes->count());
+        static::assertEquals(2, $undeletedContact->relations->count());
+        static::assertEquals(2, $undeletedContact->tags->count());
+        static::assertEquals(2, $undeletedContact->attachments->count());
+        static::assertEquals(2, count($undeletedContact->customfields));
+
+        // undo update
+        $mod = $modifications->getLastRecord();
+        $modifications->removeRecord($mod);
+        Tinebase_Timemachine_ModificationLog::getInstance()->undo(new Tinebase_Model_ModificationLogFilter(array(
+            array('field' => 'id', 'operator' => 'in', 'value' => array($mod->getId()))
+        )));
+        $undidContact = $this->_instance->get($contact->getId());
+        static::assertEquals(1, $undidContact->notes->count());
+        static::assertEquals(1, $undidContact->relations->count());
+        static::assertEquals(1, $undidContact->tags->count());
+        static::assertEquals(1, $undidContact->attachments->count());
+        static::assertEquals(1, count($undidContact->customfields));
+    }
 }
index 22c5b05..11b78cc 100644 (file)
@@ -317,15 +317,15 @@ class Addressbook_Import_CsvTest extends ImportTestCase
         
         $result = $this->_doImport($options, $definition);
         
-        $this->assertEquals(5, count($result['results']));
+        self::assertGreaterThanOrEqual(5, count($result['results']));
         // NOTE: this assertion is strange because the results vary between 1 and 2
-        $this->assertGreaterThanOrEqual(1, $result['updatecount'], 'should have updated 1 or more contacts / results: '
+        self::assertGreaterThanOrEqual(1, $result['updatecount'], 'should have updated 1 or more contacts / results: '
             . print_r($result['results']->toArray(), true));
         // NOTE: this assertion is strange because the results vary between 3 and 4
-        $this->assertTrue((3 === $result['totalcount'] || 4 === $result['totalcount']), 'should have added 3 or 4 contacts');
-        $this->assertEquals('Straßbough', $result['results'][1]['adr_one_locality'],
+        self::assertTrue((3 === $result['totalcount'] || 4 === $result['totalcount']), 'should have added 3 or 4 contacts');
+        self::assertEquals('Straßbough', $result['results'][1]['adr_one_locality'],
                 'should have changed the locality of contact #2: ' . print_r($result['results'][1]->toArray(), true));
-        $this->assertEquals('Gartencenter Röhr & Vater', $result['results'][3]['n_family']);
+        self::assertEquals('Gartencenter Röhr & Vater', $result['results'][3]['n_family']);
     }
 
     public function testSplitField()
index c2a587b..6b75366 100644 (file)
@@ -107,6 +107,7 @@ class Admin_JsonTest extends TestCase
         $accountData = $this->_getUserArrayWithPw();
         $accountData['accountPrimaryGroup'] = Tinebase_Group::getInstance()->getGroupByName('tine20phpunitgroup')->getId();
         $accountData['accountFirstName'] = 'PHPUnitup';
+        $accountData['configuration'][Tinebase_Model_FullUser::CONFIGURATION_PERSONAL_QUOTA] = 100;
         
         $account = $this->_createUser($accountData);
         
@@ -117,6 +118,9 @@ class Admin_JsonTest extends TestCase
         // check password
         $authResult = Tinebase_Auth::getInstance()->authenticate($account['accountLoginName'], $accountData['accountPassword']);
         $this->assertTrue($authResult->isValid());
+        $this->assertTrue(isset($accountData['configuration']) && isset($accountData['configuration'][Tinebase_Model_FullUser::CONFIGURATION_PERSONAL_QUOTA])
+            && $accountData['configuration'][Tinebase_Model_FullUser::CONFIGURATION_PERSONAL_QUOTA] === 100,
+            'failed to set/get account configuration');
         
         $account['accountPrimaryGroup'] = $accountData['accountPrimaryGroup'];
         return $account;
@@ -253,6 +257,8 @@ class Admin_JsonTest extends TestCase
      */
     public function testUpdateUserWithoutContainerACL()
     {
+        self::markTestSkipped('FIXME 0013338: repair some failing email tests ');
+
         $account = $this->testSaveAccount();
         $internalContainer = Tinebase_Container::getInstance()->get($account['container_id']['id']);
         Tinebase_Container::getInstance()->setGrants($internalContainer, new Tinebase_Record_RecordSet('Tinebase_Model_Grants'), TRUE, FALSE);
@@ -271,6 +277,8 @@ class Admin_JsonTest extends TestCase
      */
     public function testUpdateUserRemoveGroup()
     {
+        self::markTestSkipped('FIXME 0013338: repair some failing email tests ');
+
         $account = $this->testSaveAccount();
         $internalContainer = Tinebase_Container::getInstance()->get($account['container_id']['id']);
         Tinebase_Container::getInstance()->setGrants($internalContainer, new Tinebase_Record_RecordSet('Tinebase_Model_Grants'), TRUE, FALSE);
@@ -390,7 +398,26 @@ class Admin_JsonTest extends TestCase
         $authResult = Tinebase_Auth::getInstance()->authenticate($this->objects['user']->accountLoginName, $pw);
         $this->assertTrue($authResult->isValid());
     }
-    
+
+    /**
+     * try to reset pin
+     *
+     * @see 0013320: allow admin to reset pin for accounts
+     */
+    public function testResetPin()
+    {
+        $userArray = $this->testSaveAccount();
+
+        $pw = '1234';
+        $this->_json->resetPin($userArray, $pw);
+
+        $result = Tinebase_Auth::validateSecondFactor($userArray['accountLoginName'], '1234', array(
+            'active' => true,
+            'provider' => 'Tine20',
+        ));
+        $this->assertEquals(Tinebase_Auth::SUCCESS, $result);
+    }
+
     /**
      * testAccountContactModlog
      * 
@@ -1262,4 +1289,29 @@ class Admin_JsonTest extends TestCase
         $result = Admin_Controller_User::getInstance()->setAccountStatus($userArray['accountId'], Tinebase_Model_User::ACCOUNT_STATUS_EXPIRED);
         $this->assertEquals(1, $result);
     }
+
+    public function testSearchQuotaNodes()
+    {
+        $filterNullResult = $this->_json->searchQuotaNodes();
+        $filterRootResult = $this->_json->searchQuotaNodes(array(array(
+            'field'     => 'path',
+            'operator'  => 'equals',
+            'value'     => '/'
+        )));
+
+        static::assertEquals($filterNullResult['totalcount'], $filterRootResult['totalcount']);
+        static::assertGreaterThan(0, $filterNullResult['totalcount']);
+        foreach ($filterNullResult['results'] as $node) {
+            Tinebase_Application::getInstance()->getApplicationById($node['name']);
+        }
+
+        $filterAppResult = $this->_json->searchQuotaNodes(array(array(
+            'field'     => 'path',
+            'operator'  => 'equals',
+            'value'     => '/' . $filterNullResult['results'][0]['name']
+        )));
+
+        static::assertEquals(1, $filterAppResult['totalcount']);
+        static::assertEquals('folders', $filterAppResult['results'][0]['name']);
+    }
 }
index d02bec9..8ca4318 100644 (file)
@@ -301,4 +301,17 @@ class Calendar_Backend_SqlTest extends Calendar_TestCase
         $this->_backend->get($event1->getId());
         $this->assertEquals(0, $event1->is_deleted);
     }
+
+    /**
+     * testIncreaseSeqForContainerId
+     */
+    public function testIncreaseSeqsForContainerId()
+    {
+        $event = $this->testCreateEvent();
+        $this->_backend->increaseSeqsForContainerId($event->container_id);
+
+        $updatedEvent = $this->_backend->get($event->getId());
+
+        $this->assertEquals($event->seq + 1, $updatedEvent->seq);
+    }
 }
index 2eb5f51..cbadc3f 100644 (file)
@@ -76,7 +76,34 @@ class Calendar_Controller_EventTests extends Calendar_TestCase
         $this->assertTrue((bool) $loadedEvent->{Tinebase_Model_Grants::GRANT_EDIT});
         $this->assertTrue((bool) $loadedEvent->{Tinebase_Model_Grants::GRANT_DELETE});
     }
-    
+
+    public function testGetRecurInstance()
+    {
+        // create event and invite admin group
+        $event = $this->_getEvent();
+        $event->rrule = 'FREQ=DAILY;INTERVAL=1';
+
+        $persistentEvent = $this->_controller->create($event);
+        $exceptions = new Tinebase_Record_RecordSet('Calendar_Model_Event');
+        $nextOccurance = Calendar_Model_Rrule::computeNextOccurrence($persistentEvent, $exceptions, Tinebase_DateTime::now());
+
+        $deepLink = $nextOccurance->getDeepLink();
+        preg_match('/fakeid.*$/', $deepLink, $matches);
+        $id = $matches[0];
+
+        $recurInstance = $this->_controller->get($id);
+        $this->assertTrue($recurInstance->isRecurInstance());
+        $this->assertEquals($nextOccurance->getId(), $recurInstance->getId());
+
+        // create recur exception in the meantime
+        $nextOccurance->summary = 'exception';
+        $this->_controller->createRecurException($nextOccurance);
+        $recurInstance = $this->_controller->get($id);
+//        print_r($recurInstance->toArray());
+        $this->assertFalse($recurInstance->isRecurInstance());
+        $this->assertEquals($nextOccurance->summary, $recurInstance->summary);
+    }
+
     /**
      * testUpdateEvent
      */
index 354bee0..2dcd237 100644 (file)
@@ -1998,11 +1998,12 @@ class Calendar_JsonTests extends Calendar_TestCase
         $persistentEvent = $this->_eventController->create($event);
         $persistentEvent->setTimezone(Tinebase_Core::getUserTimezone());
 
-        $fbinfo = $this->_uit->getFreeBusyInfo($persistentEvent->attendee->toArray(), $persistentEvent->toArray());
-        $this->assertEquals(2, count($fbinfo));
+        $fbinfo = $this->_uit->getFreeBusyInfo($persistentEvent->attendee->toArray(), [$persistentEvent->toArray()]);
+        $this->assertEquals(1, count($fbinfo));
+        $this->assertEquals(2, count(array_pop($fbinfo)));
 
-        $fbinfo = $this->_uit->getFreeBusyInfo($persistentEvent->attendee->toArray(), $persistentEvent->toArray(), array($persistentEvent->uid));
-        $this->assertEquals(0, count($fbinfo));
+        $fbinfo = $this->_uit->getFreeBusyInfo($persistentEvent->attendee->toArray(), [$persistentEvent->toArray()], array($persistentEvent->uid));
+        $this->assertEquals(0, count(array_pop($fbinfo)));
     }
 
     public function testSearchAttenders()
@@ -2018,7 +2019,7 @@ class Calendar_JsonTests extends Calendar_TestCase
         $filter = array(array('field' => 'query', 'operator' => 'contains', 'value' => 'l'));
         $paging = array('sort' => 'name', 'dir' => 'ASC', 'start' => 0, 'limit' => 50);
 
-        $result = $this->_uit->searchAttenders($filter, $paging, $persistentEvent->toArray(), array());
+        $result = $this->_uit->searchAttenders($filter, $paging, [$persistentEvent->toArray()], array());
         $this->assertTrue(
             isset($result[Calendar_Model_Attender::USERTYPE_USER]) &&
             count($result[Calendar_Model_Attender::USERTYPE_USER]) === 3 &&
@@ -2026,10 +2027,10 @@ class Calendar_JsonTests extends Calendar_TestCase
             isset($result[Calendar_Model_Attender::USERTYPE_GROUP]) &&
             isset($result[Calendar_Model_Attender::USERTYPE_RESOURCE]) &&
             isset($result['freeBusyInfo']) &&
-            count($result['freeBusyInfo']) === 2, print_r($result, true));
+            count(array_pop($result['freeBusyInfo'])) === 2, print_r($result, true));
 
         $filter[] = array('field' => 'type', 'value' => array(Calendar_Model_Attender::USERTYPE_RESOURCE));
-        $result = $this->_uit->searchAttenders($filter, $paging, $persistentEvent->toArray(), array());
+        $result = $this->_uit->searchAttenders($filter, $paging, [$persistentEvent->toArray()], array());
         $this->assertTrue(
             !isset($result[Calendar_Model_Attender::USERTYPE_USER]) &&
             !isset($result[Calendar_Model_Attender::USERTYPE_GROUP]) &&
@@ -2037,7 +2038,7 @@ class Calendar_JsonTests extends Calendar_TestCase
             count($result[Calendar_Model_Attender::USERTYPE_RESOURCE]) === 3 &&
             count($result[Calendar_Model_Attender::USERTYPE_RESOURCE]['results']) === 0 &&
             isset($result['freeBusyInfo']) &&
-            count($result['freeBusyInfo']) === 0, print_r($result, true));
+            count(array_pop($result['freeBusyInfo'])) === 0, print_r($result, true));
     }
 
     public function testSearchFreeTime()
@@ -2051,6 +2052,7 @@ class Calendar_JsonTests extends Calendar_TestCase
         $event->originator_tz = $event->dtstart->getTimezone()->getName();
 
         $options = array(
+            'from'        => $event->dtstart->getClone()->addDay(2)->setHour(12),
             'constraints' => array(array(
                 'dtstart'   => $event->dtstart->getClone()->setHour(10),
                 'dtend'     => $event->dtstart->getClone()->setHour(22),
@@ -2058,11 +2060,78 @@ class Calendar_JsonTests extends Calendar_TestCase
             )),
         );
 
-        $expectedDtStart = new Tinebase_DateTime('2009-03-27 10:00:00', $event->originator_tz);
+        $expectedDtStart = new Tinebase_DateTime('2009-03-27 12:00:00', $event->originator_tz);
         $expectedDtStart->setTimezone(Tinebase_Core::getUserTimezone());
 
         $result = $this->_uit->searchFreeTime($event->toArray(), $options);
-        static::assertTrue(is_array($result) && count($result) === 3 && count($result['results']) === 1);
+        static::assertTrue(is_array($result) && count($result) === 4 && count($result['results']) === 1);
+        static::assertEquals($expectedDtStart->toString(), $result['results'][0]['dtstart']);
+    }
+
+    public function testSearchFreeTime1()
+    {
+        // 2009-03-25 => Mittwoch
+        $event = $this->_getEvent();
+        $event->attendee = new Tinebase_Record_RecordSet('Calendar_Model_Attender', array(
+            array('user_id' => $this->_getPersonasContacts('sclever')->getId(), 'user_type' => Calendar_Model_Attender::USERTYPE_USER),
+            array('user_id' => $this->_getPersonasContacts('pwulf')->getId(), 'user_type' => Calendar_Model_Attender::USERTYPE_USER)
+        ));
+        $event->originator_tz = $event->dtstart->getTimezone()->getName();
+
+        $options = array(
+            'constraints' => array(array(
+                'dtstart'   => $event->dtstart->getClone()->subDay(1)->setHour(10),
+                'dtend'     => $event->dtstart->getClone()->subDay(1)->setHour(22),
+                'rrule'     => 'FREQ=WEEKLY;INTERVAL=1;BYDAY=MO,TU'
+            ), array(
+                'dtstart'   => $event->dtstart->getClone()->subDay(1)->setHour(13),
+                'dtend'     => $event->dtstart->getClone()->subDay(1)->setHour(16),
+                'rrule'     => 'FREQ=WEEKLY;INTERVAL=1;BYDAY=TH,FR'
+            )),
+        );
+
+        $expectedDtStart = new Tinebase_DateTime('2009-03-26 13:00:00', $event->originator_tz);
+        $expectedDtStart->setTimezone(Tinebase_Core::getUserTimezone());
+
+        $result = $this->_uit->searchFreeTime($event->toArray(), $options);
+        static::assertTrue(is_array($result) && count($result) === 4 && count($result['results']) === 1);
+        static::assertEquals($expectedDtStart->toString(), $result['results'][0]['dtstart']);
+    }
+
+    public function testSearchFreeTime2()
+    {
+        // 2009-03-25 => Mittwoch
+        $event = $this->_getEvent();
+        $event->attendee = new Tinebase_Record_RecordSet('Calendar_Model_Attender', array(
+            array('user_id' => $this->_getPersonasContacts('sclever')->getId(), 'user_type' => Calendar_Model_Attender::USERTYPE_USER),
+            array('user_id' => $this->_getPersonasContacts('pwulf')->getId(), 'user_type' => Calendar_Model_Attender::USERTYPE_USER)
+        ));
+        $event->originator_tz = $event->dtstart->getTimezone()->getName();
+
+        $options = array(
+            'constraints' => array(array(
+                'dtstart'   => $event->dtstart->getClone()->subDay(1)->setHour(10),
+                'dtend'     => $event->dtstart->getClone()->subDay(1)->setHour(22),
+                'rrule'     => 'FREQ=WEEKLY;INTERVAL=1;BYDAY=MO,TU'
+            ), array(
+                'dtstart'   => $event->dtstart->getClone()->subDay(1)->setHour(13),
+                'dtend'     => $event->dtstart->getClone()->subDay(1)->setHour(16),
+                'rrule'     => 'FREQ=WEEKLY;INTERVAL=1;BYDAY=TH,FR'
+            )),
+        );
+
+        $expectedDtStart = new Tinebase_DateTime('2009-03-27 13:00:00', $event->originator_tz);
+        $expectedDtStart->setTimezone(Tinebase_Core::getUserTimezone());
+
+        $event->dtstart->addDay(1)->setTime(16, 0 ,0);
+        $event->dtend->addDay(1)->setTime(17, 0 ,0);
+
+        $createEvent = new Calendar_Model_Event(array(), true);
+        $createEvent->setFromJsonInUsersTimezone($event->toArray());
+        Calendar_Controller_Event::getInstance()->create($createEvent);
+
+        $result = $this->_uit->searchFreeTime($event->toArray(), $options);
+        static::assertTrue(is_array($result) && count($result) === 4 && count($result['results']) === 1);
         static::assertEquals($expectedDtStart->toString(), $result['results'][0]['dtstart']);
     }
 }
index 8be260c..55b7010 100644 (file)
@@ -42,12 +42,12 @@ class Crm_Acl_RolesTest extends TestCase
             'accountEmailAddress'   => 'crmphpunit@metaways.de'
         ));
         $this->objects['role'] = new Tinebase_Model_Role(array(
-            'id'                    => 10,
+            'id'                    => '10',
             'name'                  => 'phpunitrole',
             'description'           => 'test role for phpunit',
         ));
         $this->objects['role_2'] = new Tinebase_Model_Role(array(
-            'id'                    => 11,
+            'id'                    => '11',
             'name'                  => 'phpunitrole 2',
             'description'           => 'test role 2 for phpunit',
         ));
index 3731c6d..f1bbedd 100644 (file)
@@ -37,7 +37,9 @@ class ExampleApplication_ControllerTest extends ExampleApplication_TestCase
 
         ob_start();
         ob_clean();
-        $observerController->fireEvent($observable, 'Tinebase_Event_Record_Update');
+        $event = new Tinebase_Event_Record_Update();
+        $event->observable = $observable;
+        $observerController->fireEvent($event);
         $result = ob_get_clean();
 
         $this->assertEquals('catched record update for observing id: exampleIdentifier', $result);
index 076cb13..b01913a 100644 (file)
@@ -264,16 +264,18 @@ class Felamimail_Controller_AccountTest extends TestCase
      */
     public function testUseEmailAsLoginName()
     {
+        self::markTestSkipped('FIXME 0013338: repair some failing email tests ');
+
         // change config to standard imap backend
         $this->_oldConfig = $imapConfig = Tinebase_Config::getInstance()->get(Tinebase_Config::IMAP);
         $imapConfig->backend = Tinebase_EmailUser::IMAP_STANDARD;
         $imapConfig->domain = '';
+        $imapConfig->instanceName = '';
         $imapConfig->useEmailAsUsername = true;
         Tinebase_Config::getInstance()->set(Tinebase_Config::IMAP, $imapConfig);
 
         Felamimail_Controller_Account::getInstance()->delete(array($this->_account->getId()));
         $this->_account = $this->_controller->search()->getFirstRecord();
-
         $this->_account->resolveCredentials();
         $this->assertEquals(Tinebase_Core::getUser()->accountEmailAddress, $this->_account->user);
     }
index a5769ff..416c7a4 100644 (file)
@@ -1112,17 +1112,16 @@ class Felamimail_Frontend_JsonTest extends TestCase
         $messageToSave = $this->_getMessageData();
         $messageToSave['bcc'] = array('bccaddress@email.org', 'bccaddress2@email.org');
         
-        $draftsFolder = $this->_getFolder($this->_account->drafts_folder);
-        $returned = $this->_json->saveMessageInFolder($this->_account->drafts_folder, $messageToSave);
+        $this->_getFolder($this->_account->drafts_folder);
+        $this->_json->saveMessageInFolder($this->_account->drafts_folder, $messageToSave);
         $this->_foldersToClear = array($this->_account->drafts_folder);
         
         // check if message is in drafts folder and recipients are present
         $message = $this->_searchForMessageBySubject($messageToSave['subject'], $this->_account->drafts_folder);
-        $this->assertEquals($messageToSave['subject'],  $message['subject']);
-        $this->assertEquals($messageToSave['to'][0],    $message['to'][0], 'recipient not found');
-        $this->assertEquals(2, count($message['bcc']), 'bcc recipient not found: ' . print_r($message, TRUE));
-        $this->assertEquals($messageToSave['bcc'][0],   $message['bcc'][0], '1st bcc recipient not found');
-        $this->assertEquals($messageToSave['bcc'][1],   $message['bcc'][1], '2nd bcc recipient not found');
+        self::assertEquals($messageToSave['subject'],  $message['subject']);
+        self::assertEquals($messageToSave['to'][0],    $message['to'][0], 'recipient not found');
+        self::assertEquals(2, count($message['bcc']), 'bcc recipient not found: ' . print_r($message, TRUE));
+        self::assertContains('bccaddress',   $message['bcc'][0], 'bcc recipient not found');
     }
     
     /**
@@ -2166,6 +2165,7 @@ IbVx8ZTO7dJRKrg72aFmWTf0uNla7vicAhpiLWobyNYcZbIjrAGDfg==
      */
     public function testAttachmentMethodPublicDownloadLinkUpload()
     {
+        Zend_Registry::set('locale', new Zend_Locale('en'));
         $message = $this->_testAttachmentType('download_public');
 
         self::assertTrue(isset($message['attachments']), 'attachment set: ' . print_r($message, true));
@@ -2198,6 +2198,7 @@ IbVx8ZTO7dJRKrg72aFmWTf0uNla7vicAhpiLWobyNYcZbIjrAGDfg==
      */
     public function testAttachmentMethodProtectedDownloadLink()
     {