pax_global_header00006660000000000000000000000064136101346470014517gustar00rootroot0000000000000052 comment=422bd574c12a337a09201a6f1118bc412886549f hijra-1.0/000077500000000000000000000000001361013464700124545ustar00rootroot00000000000000hijra-1.0/HijriApplet000077500000000000000000000550701361013464700146240ustar00rootroot00000000000000#!/usr/bin/python3 # -*- coding: utf-8 -*- # -*- Mode: Python; py-indent-offset: 4 -*- """ Hijri Tray Applet for GNOME (also works with KDE) Copyright (c) 2006-2011 Muayyad Saleh Alsadi Based on an enhanced algorithm designed by me the algorithm is discussed in a book titled "حتى لا ندخل جحور الضباب" (not yet published) The algorith itself is not here, it's in another file called hijra.py Released under terms on Waqf Public License. This program is free software; you can redistribute it and/or modify it under the terms of the latest version Waqf Public License as published by Ojuba.org. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. The Latest version of the license can be found on "http://www.ojuba.org/wiki/doku.php/waqf/license" """ # TODO: Implement ocations reminder # TODO: Implement configuration, ie. allow direction change, and setting first way of week import sys, os, os.path, time, re import gi gi.require_version("Gtk", "3.0") from gi.repository import GObject, Gtk, Gdk import sys no_notify = True try: from gi.repository import require_version require_version('Notify', '0.7') from gi.repository import Notify as pynotify except ImportError: no_notify=True from HijriCal import HijriCal cal = HijriCal() Colors = [[(Gdk.Color(red=60909, green=60909, blue=60909), Gdk.Color(red=11822, green=13364, blue=13878), '#edededededed', '#2e2e34343636'), (Gdk.Color(red=19018, green=37008, blue=55769), Gdk.Color(red=65535, green=65535, blue=65535), '#4a4a9090d9d9', 'wheat'), (Gdk.Color(red=62708, green=62708, blue=62194), Gdk.Color(red=42919, green=43947, blue=42919), '#f4f4f4f4f2f2', '#a7a7ababa7a7')], [(Gdk.Color(red=11822, green=13364, blue=13878), Gdk.Color(red=60909, green=60909, blue=60909), '#2e2e34343636', '#edededededed'), (Gdk.Color(red=65535, green=65535, blue=65535), Gdk.Color(red=19018, green=37008, blue=55769), '#ffffffffffff', '#4a4a9090d9d9'), (Gdk.Color(red=60909, green=60909, blue=60909), Gdk.Color(red=11822, green=13364, blue=13878), '#edededededed', '#2e2e34343636')]] week_days = [ "الأحد", "الإثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت" ] months = [ "محرم","صفر","ربيع الأول","ربيع الثاني", "جمادى الأولى","جمادى الثانية","رجب","شعبان", "رمضان","شوال","ذو القعدة","ذو الحجة" ] gmonths = [ "كانون ثاني ( يناير )", "شباط ( فبراير )", "آذار ( مارس )", "نيسان ( أبريل )", "أيار ( مايو )", "حزيران ( يونيو )","تموز ( يوليو )","آب ( أغسطس )", "أيلول ( سبتمبر )", "تشرين أول ( أكتوبر )", "تشرين ثاني ( نوفمبر )", "كانون أول ( ديسمبر )" ] def wday_index(i): ws = cal.get_week_start() if (cal.get_direction() == 1): return (i+ws) % 7 else: return ((6-i)+ws) % 7 def wday_from_index(i): ws = cal.get_week_start() if (cal.get_direction() == 1): return (7+i-ws) % 7 else: return (6+ws-i)%7 def guess_data_dir(): d = os.path.dirname(__file__) dd = os.path.join(d, '..', 'share', 'hijra', 'hijra-data') if os.path.isdir(dd): return dd dd = os.path.join(d, 'hijra-data') return dd # Update icon file def update_icon_file(day,mth): svg_fn = os.path.join(guess_data_dir(), "cal-template.svg") if not os.path.isfile(svg_fn): return None out_fn = os.path.expanduser('~/.hijra-icon.svg') day_re = re.compile(r"""(\d+)""", re.M) mth_re = re.compile(r"""(\d+)""", re.M) svg_text = open(svg_fn, 'rt').read() svg_text, n = mth_re.subn("%02d" % mth, svg_text) svg_text, n = day_re.subn("%02d" % day, svg_text) try: open(out_fn, 'wt+').write(svg_text) except: return None return out_fn class CalAbout(Gtk.AboutDialog): def __init__(self, win): Gtk.AboutDialog.__init__(self, parent = win) self.set_default_response(Gtk.ResponseType.CLOSE) self.connect('delete-event', lambda *a: self.hide()) self.connect('response', lambda *a: self.hide()) try: self.set_program_name("التقويم الهجري") except AttributeError: pass self.set_name("التقويم الهجري") #self.set_version(version) self.set_copyright(""" Copyright (c) 2006-2011 Muayyad Saleh Alsadi Copyright (c) 2011-2017 Ojuba Team """) self.set_comments("Hijri Islamic Calendar") self.set_license(""" Released under terms on Waqf Public License. This program is free software; you can redistribute it and/or modify it under the terms of the latest version Waqf Public License as published by Ojuba.org. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. The Latest version of the license can be found on "http://www.ojuba.org/wiki/waqf/license" """) self.set_website("http://hijra.ojuba.org/") self.set_website_label("http://hijra.ojuba.org") self.set_authors(["Muayyad Saleh Alsadi "]) # self.set_documenters(documenters) # self.set_artists(artists) # self.set_translator_credits(translator_credits) # self.set_logo(logo) # self.set_logo_icon_name(icon_name) class CalButton(Gtk.Button): def __init__(self, title=None, tooltip=None, img=None, ico_name=None, img_fn=None, stock=None): Gtk.Button.__init__(self) if title: self.set_text(title) if stock: img = Gtk.Image() img.set_from_stock(stock, Gtk.IconSize.SMALL_TOOLBAR) if img_fn: img = Gtk.Image() img.set_from_file(img_fn) if ico_name: img = Gtk.Image() img.set_from_icon_name(ico_name) if img: self.set_image(img) if tooltip: self.set_tooltip_text(tooltip) self.set_focus_on_click(False) class CalWindow(Gtk.Window): def __init__(self, cal, st): Gtk.Window.__init__(self) self._first_time_show = False self.cal = cal self.st = st self.about = CalAbout(self) self.set_resizable(False) self.set_title("التقويم الهجري") self.set_position(Gtk.WindowPosition.CENTER) self.accel = Gtk.AccelGroup() self.add_accel_group(self.accel) self.hide_on_delete() #self.set_size_request(200, 300) self.connect('delete-event', lambda w, *a: w.hide() or True) vb = Gtk.VBox(False,0); self.add(vb) hb = Gtk.HBox(False,0); vb.pack_start(hb,False, False, 0) b = CalButton(tooltip = "عام سابق", stock = Gtk.STOCK_GOTO_FIRST) hb.pack_start(b,False, False, 0) b.connect('clicked', self.prev_year_cb) b = CalButton(tooltip = "شهر سابق", stock = Gtk.STOCK_GO_BACK) hb.pack_start(b,False, False, 0) b.connect('clicked', self.prev_month_cb) self.t = Gtk.Label("...") self.t.set_justify(Gtk.Justification.CENTER) hb.pack_start(self.t, True, True, 0) b = CalButton(tooltip = "شهر تالي", stock =Gtk.STOCK_GO_FORWARD) hb.pack_start(b,False, False, 0) b.connect('clicked', self.next_month_cb) b = CalButton(tooltip = "عام تالي", stock = Gtk.STOCK_GOTO_LAST) hb.pack_start(b,False, False, 0) b.connect('clicked', self.next_year_cb) hb = Gtk.HBox(False,0); vb.pack_start(hb,False, False, 0) grid = Gtk.Table(7,6,True) vb.pack_start(grid,True, True, 0) self.fill_grid(grid) hb = Gtk.HBox(False,0); vb.pack_start(hb,False, False, 0) self.g_e = e = Gtk.Entry() e.set_width_chars(6) e.set_tooltip_text("العام الجريجوري") e.connect("activate", self.convert_cb) hb.pack_start(e,False, False, 0) img = Gtk.Image() img.set_from_stock(Gtk.STOCK_CONVERT, Gtk.IconSize.MENU) hb.pack_start(img,False, False, 0) self.h_e = e = Gtk.Entry() e.set_width_chars(6) e.set_tooltip_text("العام الهجري") hb.pack_start(e,False, False, 0) img = Gtk.Image() img.set_from_stock(Gtk.STOCK_JUMP_TO, Gtk.IconSize.MENU) hb.pack_start(img,False, False, 0) e.connect("activate", self.jump_cb) b = CalButton(tooltip = "اليوم", stock = Gtk.STOCK_REFRESH) b.connect("clicked", self.today_cb) hb.pack_start(b, False, False, 0) b = CalButton(tooltip = "حول", stock = Gtk.STOCK_ABOUT) b.connect("clicked", lambda *a: self.st.show_hide_cb(True)) hb.pack_start(b, False, False, 0) def fill_grid(self, grid): days_l = [None for i in range(7)] cell = [[None for i in range(7)] for j in range(7)] for i in range(7): days_l[i] = Gtk.Label('...') e = Gtk.EventBox(); e.add(days_l[i]) grid.attach(e, i, i+1, 0, 1, Gtk.AttachOptions.FILL | Gtk.AttachOptions.EXPAND, Gtk.AttachOptions.FILL | Gtk.AttachOptions.EXPAND, 0, 0) for n in range(42): i = n%7 j = int(n/7) cell[j][i] = Gtk.Label("-") cell[j][i].set_alignment(0.5,0.5) cell[j][i].set_justify(Gtk.Justification.CENTER) cell[j][i].set_tooltip_text('') e = Gtk.EventBox() e.add(cell[j][i]) grid.attach(e, i, i+1, j+1, j+2, Gtk.AttachOptions.FILL | Gtk.AttachOptions.EXPAND, Gtk.AttachOptions.FILL | Gtk.AttachOptions.EXPAND, 0, 0) self.cell = cell self.days_l = days_l def prev_year_cb(self, *a, **kw): self.cal.goto_hijri_day(self.cal.Y-1, self.cal.M, 1) self.update() def next_year_cb(self, *a, **kw): self.cal.goto_hijri_day(self.cal.Y+1, self.cal.M, 1) self.update() def prev_month_cb(self, *a, **kw): Y, M, D = self.cal.Y, self.cal.M-1, 1 if (M < 1): M = 12 Y -= 1 self.cal.goto_hijri_day(Y, M, 1) self.update() def next_month_cb(self, *a, **kw): Y, M, D = self.cal.Y, self.cal.M+1, 1 if (M > 12): M = 1 Y += 1 self.cal.goto_hijri_day(Y, M, 1) self.update() def today_cb(self, *a, **kw): self.cal.goto_today() self.update() def convert_cb(self, *a, **kw): try: y = int(self.g_e.get_text()) except ValueError: return self.cal.goto_gregorian_day(y, 1, 1) self.h_e.set_text(str(self.cal.Y)) self.update() def jump_cb(self, *a, **kw): try: y = int(self.h_e.get_text()) except ValueError: return self.cal.goto_hijri_day(y, 1, 1) self.update() def get_theme_colors(self): # colors[is_holyday][normal selected inactive]=[fg,bg,fg_s,bg_s] self.colors = Colors return self.colors colors = [[[0 for i in (1,2,3,4)] for j in (1,2,3)] for k in (1,2)] m = Gtk.Window.get_style(self) if not m.bg: self.colors = Colors return self.colors for i,s in enumerate((Gtk.StateType.NORMAL, Gtk.StateType.SELECTED, Gtk.StateType.INSENSITIVE)): fg, bg = m.fg[s], m.bg[s] colors[0][i] = bg, fg, bg.to_string(), fg.to_string() colors[1][i] = fg, bg, fg.to_string(), bg.to_string() self.colors = colors return self.colors def update(self): colors = self.get_theme_colors() if (self.cal.Y, self.cal.M) == self.cal.today[0:2]: self.cal.goto_today() self.t.set_text(months[self.cal.M-1]+" "+str(self.cal.Y)) self.g_e.set_text(str(self.cal.gy)) self.h_e.set_text(str(self.cal.Y)) a = self.cal.get_array() b = self.cal.get_g_array() for i in range(7): self.days_l[i].set_text(week_days[wday_index(i)]) # colors[is_holyday][normal selected inactive]=[fg,bg,fg_s,bg_s] self.days_l[i].modify_fg(Gtk.StateType.NORMAL, colors[1][1][0]) l = self.days_l[i].get_parent() l.modify_fg(Gtk.StateType.NORMAL, colors[1][1][0]) l.modify_bg(Gtk.StateType.NORMAL, colors[1][1][1]); holyday_col = wday_from_index((6+self.cal.get_week_start())%7) for j in range(6): c = self.cell[j][holyday_col].get_parent() c.modify_bg(Gtk.StateType.NORMAL, colors[1][1][1]) for n in range(42): i = n%7 j = int(n/7) if (a[j][i]): if a[j][i] == self.cal.D: is_selected = 0 else: is_selected = 1 if i == holyday_col: is_holyday = 1 else: is_holyday = 0 self.cell[j][i].set_markup('%02d\n%02d/%02d' % (colors[is_holyday][is_selected][2], colors[is_holyday][is_selected][3], a[j][i], b[j][i][0],b[j][i][1])) h_str = "%d من %s لعام %d هـ" % (a[j][i], months[self.cal.M-1], self.cal.Y) g_str = "%d من %s لعام %d م" % (b[j][i][0], gmonths[b[j][i][1]-1], b[j][i][2]) self.cell[j][i].set_tooltip_text("%s\n%s" % (h_str,g_str)) else: self.cell[j][i].set_text('-') self.cell[j][i].set_tooltip_text('') def first_time_show(self): self._first_time_show = True # FIXME: what is Gtk.TEXT_DIR_RTL in gtk3 ? #if Gtk.Widget.get_default_direction()==Gtk.TEXT_DIR_LTR: if Gtk.Widget.get_default_direction() == 1: self.cal.set_direction(-1) # LTR else: self.cal.set_direction(1) # RTL self.update() def show(self): r = super(Gtk.Window, self).show() if not self._first_time_show: self.first_time_show() return r def show_all(self): r = super(Gtk.Window, self).show_all() if not self._first_time_show: self.first_time_show() return r class CalStatusIcon(Gtk.StatusIcon): def __init__(self, cal): Gtk.StatusIcon.__init__(self) self.cal = cal self.notify = None if not no_notify: pynotify.init("التقويم الهجري") self.notify = pynotify.Notification() Y, M, D, W = self.cal.today yy, mm, dd = self.cal.g_today self.connect ('button-press-event', self.clicked_cb) self.set_title("التقويم الهجري") Y=int(Y); M=int(M); D=int(D); W=int(W); self.last_d_m = "%02d/%02d" % (D, M) self.set_tooltip_text("%s, %d من %s لعام %d" % (week_days[W], D, months[M-1], Y)) svg_fn = update_icon_file(D, M) if svg_fn: self.set_from_file(svg_fn) Gtk.Window.set_default_icon_from_file(svg_fn) else: self.set_from_icon_name("stock_calendar") Gtk.window_set_default_icon_name('stock_calendar') self.win = CalWindow(cal, self) self.set_visible(True) self.setup_popup_menu() self.update_notify() if not '--hidden' in sys.argv: self.win.show_all() else: self.show_notify() GObject.timeout_add(5000, self.update) def update_notify(self): if not self.notify: return Y, M, D, W = self.cal.today yy, mm, dd = self.cal.g_today self.notify.set_property('icon-name','gtk-dialog-info') self.notify.set_property('summary', "التقويم الهجري" ) self.notify.set_property('body', "%s, %d من %s لعام %d\nالموافق %d من %s لعام %s" % (week_days[W], D, months[M-1], Y, dd, gmonths[mm-1], yy)) #self.notify.set_timeout(5) def show_notify(self): if not self.notify: return try: self.notify.show() except: pass def update(self): self.cal.refresh_today() Y,M,D,W = self.cal.today d_m = "%02d/%02d" % (D, M) if self.last_d_m == d_m: return True self.update_notify() self.set_tooltip_text("%s, %d من %s لعام %d" % (week_days[W], D, months[M-1], Y)) self.last_d_m = d_m svg_fn = update_icon_file(D,M) if svg_fn: self.set_from_file(svg_fn) Gtk.Window.set_default_icon_from_file(svg_fn) self.win.set_icon_from_file(svg_fn) self.win.about.set_icon_from_file(svg_fn) self.win.update() #self.setup_notify(Y,M,D,W) self.show_notify() return True def show_popup_menu(self): self.popup_menu.show_all() if self.win.get_visible(): self.popup_menu.get_children()[0].hide() else: self.popup_menu.get_children()[1].hide() self.popup_menu.popup(None, None, self.position_menu, self, 3, Gtk.get_current_event_time()) def clicked_cb(self, w, event): if event.button == 1: self.show_hide_cb() elif event.button == 2: self.show_notify() elif event.button == 3: self.show_popup_menu() def show_hide_cb(self, about = False, *a): if about or not self.win.g_e.get_property('visible'): self.show_cb() else: self.win.set_property("visible", not self.win.get_property("visible")) if about: self.win.about.run() def show_cb(self, *a): self.win.show_all() self.update() def setup_popup_menu(self): self.popup_menu=popup_menu=Gtk.Menu() #i = Gtk.ImageMenuItem("إظهار") #img=Gtk.Image() #img.set_from_stock(Gtk.STOCK_OPEN, Gtk.IconSize.MENU) #i.set_image(img) i = Gtk.ImageMenuItem.new_from_stock(Gtk.STOCK_OPEN, None) i.connect('activate', self.show_cb) i.set_always_show_image(True) popup_menu.add(i) i = Gtk.ImageMenuItem.new_from_stock(Gtk.STOCK_CLOSE, None) i.connect('activate', self.win_hide_cb ) i.set_always_show_image(True) popup_menu.add(i) i = Gtk.ImageMenuItem.new_from_stock(Gtk.STOCK_ABOUT, None) i.connect('activate', lambda *a: self.show_hide_cb(True)) i.set_always_show_image(True) popup_menu.add(i) i = Gtk.ImageMenuItem.new_from_stock(Gtk.STOCK_QUIT, None) i.connect('activate', Gtk.main_quit) i.set_always_show_image(True) popup_menu.add(i) def win_hide_cb(self, *w): self.win.hide() self.win.about.hide() bus = None st = None try: import dbus import dbus.service #import gobject # for GObject.MainLoop() if no gtk is to be used from dbus.mainloop.glib import DBusGMainLoop dbus_loop = DBusGMainLoop(set_as_default=True) bus = dbus.SessionBus() except ImportError: pass # use dbus so that, only one Applet is shown def init_dbus(): global bus_name, bus_object,win if not bus: return class Manager(dbus.service.Object): def __init__(self, bus, path): dbus.service.Object.__init__(self,bus,path) @dbus.service.method("org.freedesktop.HijriApplet", in_signature = '', out_signature = '') def Show(self): st.win.show_all() @dbus.service.method("org.freedesktop.HijriApplet", in_signature = '', out_signature = 's') def Version(self): return "0.1" # values from /usr/include/dbus-1.0/dbus/dbus-shared.h r = bus.request_name('org.freedesktop.HijriApplet', flags = 0x4) if r != 1: print("Another process own HijriApplet Service, ask it to show up: ") trials = 0 appletbus = False while(appletbus == False and trials < 20): print(".", end=' ') try: appletbus = bus.get_object("org.freedesktop.HijriApplet","/Manager") break except: appletbus = False time.sleep(1) trials += 1 print("*") if appletbus: appletbus.Show(dbus_interface = 'org.freedesktop.HijriApplet') else: print("unable to connect") exit(0) bus_name = dbus.service.BusName("org.freedesktop.HijriApplet", bus) bus_object = Manager(bus, '/Manager') def main(): global st init_dbus() st=CalStatusIcon(cal) Gtk.main() if __name__ == '__main__': main() hijra-1.0/HijriCal.py000066400000000000000000000101641361013464700145150ustar00rootroot00000000000000#!/usr/bin/python3 # -*- coding: utf-8 -*- """ Hijri Islamic High level Calendar API, Copyright (c) 2006-2008 Muayyad Saleh Alsadi Based on an enhanced algorithm designed by me the algorithm is discussed in a book titled "حتى لا ندخل جحور الضباب" (not yet published) This file can be used to implement apps, gdesklets or karamba ..etc The algorith itself is not here, it's in another file called hijra.py Released under terms on Waqf Public License. This program is free software; you can redistribute it and/or modify it under the terms of the latest version Waqf Public License as published by Ojuba.org. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. The Latest version of the license can be found on "http://www.ojuba.org/wiki/doku.php/waqf/license" """ from time import localtime from hijra import * class HijriCal: """a Class that provide a high level Islamic Hijri calendar API""" def __init__(self): """Create HijriCal Object""" self.__md=[[""]*7,[""]*7,[""]*7,[""]*7,[""]*7,[""]*7] # 7 days on at most 6 weeks self.__g_md=[[""]*7,[""]*7,[""]*7,[""]*7,[""]*7,[""]*7] # 7 days on at most 6 weeks self.__direct=-1; self.__ws=6 # make Sat is first day of week, and fill rows directly self.goto_today() def goto_today(self): """Jump to today""" yy, mm, dd = localtime()[:3] self.g_today= (yy, mm, dd) Y,M,D=self.goto_gregorian_day(yy, mm, dd) wd=hijri_day_of_week (Y, M, D) self.today= (Y, M, D, wd) def refresh_today(self): """check is today is uptodate, update them if not and return True""" if self.g_today==localtime()[:3] : return False else: yy, mm, dd = localtime()[:3] self.g_today= (yy, mm, dd) Y, M, D=gregorian_to_hijri(yy,mm,dd) wd=hijri_day_of_week (Y, M, D) self.today= (Y, M, D, wd) return True def goto_gregorian_day(self,yy, mm, dd): """Jump to some Hijri day""" try: Y, M, D = gregorian_to_hijri(yy,mm,dd); self.goto_hijri_day(Y, M, D) except: self.validate() return (self.Y,self.M,self.D) def goto_hijri_day(self,Y,M,D): """Jump to some Hijri day""" self.Y,self.M,self.D=Y,M,D self.gy,self.gm,self.gd=hijri_to_gregorian(Y,M,D) self.validate() self.mn=hijri_month_days(self.Y, self.M) self.ms=(7 - self.__ws + hijri_day_of_week(self.Y, self.M, 1) )% 7 self.fill_month_days() return (Y,M,D) def fill_month_days(self): """for internal usage""" Y,M,D = self.Y,self.M, 1 gy,gm,gd=hijri_to_gregorian(Y,M,D) gn=gregorian_month_days(gy,gm) for i in range(6): for j in range(7): self.__md[i][j]=""; self.__g_md[i][j]="" row=0 if self.__direct>0: col=self.ms; endcol=7; icol=0 else: col=6-self.ms; endcol=-1; icol=6 for i in range(self.mn): self.__md[row][col]=i+1; self.__g_md[row][col]=(gd,gm,gy); gd+=1; if (gd>gn): gd=1; gm+=1 if gm>12: gm=1; gy+=1 col+=self.__direct; if (col==endcol): row+=1; col=icol def validate(self): """Make sure the the current Y,M,D is a a valid date, return 0 if it's already valid""" f=0 if self.M<1: self.M=12; self.Y-=1; f=1 if self.M>12: self.M=1; self.Y+=1; f=1 if self.Y<1: self.Y=1; f=1 if self.D<1: self.D=1; f=1 d=hijri_month_days(self.Y, self.M) if self.D>d : self.D=d; f=1 return f def get_array(self): return tuple(self.__md) def get_g_array(self): return tuple(self.__g_md) def get_week_start(self): return self.__ws def set_week_start(self,ws): """Set the first day of the week, 0:Sun, 1:Mon, ..., 6:Sat.""" self.__ws=ws self.goto_hijri_day(self.Y, self.M, self.D) def get_direction(self): return self.__direct def set_direction(self, direct): """Set the BiDi RTL direction, 1 direct, -1 reversed""" self.__direct=direct self.goto_hijri_day(self.Y, self.M, self.D) hijra-1.0/gnome-shell-extension/000077500000000000000000000000001361013464700167005ustar00rootroot00000000000000hijra-1.0/gnome-shell-extension/extension.js000066400000000000000000000005201361013464700212470ustar00rootroot00000000000000 //const Panel = imports.ui.panel; const StatusIconDispatcher = imports.ui.statusIconDispatcher; function init(){ } function enable() { StatusIconDispatcher.STANDARD_TRAY_ICON_IMPLEMENTATIONS['hijriapplet'] = 'hijriapplet'; } function disable() { StatusIconDispatcher.STANDARD_TRAY_ICON_IMPLEMENTATIONS['hijriapplet'] = ''; } hijra-1.0/gnome-shell-extension/metadata.json000066400000000000000000000041041361013464700213520ustar00rootroot00000000000000{ "uuid": "HijriApplet@ojuba.org", "shell-version": ["3.2", "3.4", "3.6", "3.8", "3.10", "3.12", "3.14", "3.16", "3.18", "3.20", "3.22.0", "3.23.0", "3.24.0", "3.25.0", "3.26.0", "3.27.0", "3.28.0", "3.29.0", "3.30.0", "3.22.1", "3.23.1", "3.24.1", "3.25.1", "3.26.1", "3.27.1", "3.28.1", "3.29.1", "3.30.1", "3.22.2", "3.23.2", "3.24.2", "3.25.2", "3.26.2", "3.27.2", "3.28.2", "3.29.2", "3.30.2", "3.22.3", "3.23.3", "3.24.3", "3.25.3", "3.26.3", "3.27.3", "3.28.3", "3.29.3", "3.30.3", "3.22.4", "3.23.4", "3.24.4", "3.25.4", "3.26.4", "3.27.4", "3.28.4", "3.29.4", "3.30.4", "3.22.5", "3.23.5", "3.24.5", "3.25.5", "3.26.5", "3.27.5", "3.28.5", "3.29.5", "3.30.5", "3.22.6", "3.23.6", "3.24.6", "3.25.6", "3.26.6", "3.27.6", "3.28.6", "3.29.6", "3.30.6", "3.22.7", "3.23.7", "3.24.7", "3.25.7", "3.26.7", "3.27.7", "3.28.7", "3.29.7", "3.30.7", "3.22.8", "3.23.8", "3.24.8", "3.25.8", "3.26.8", "3.27.8", "3.28.8", "3.29.8", "3.30.8", "3.22.9", "3.23.9", "3.24.9", "3.25.9", "3.26.9", "3.27.9", "3.28.9", "3.29.9", "3.30.9", "3.22.90", "3.23.90", "3.24.90", "3.25.90", "3.26.90", "3.27.90", "3.28.90", "3.29.90", "3.30.90", "3.22.91", "3.23.91", "3.24.91", "3.25.91", "3.26.91", "3.27.91", "3.28.91", "3.29.91", "3.30.91", "3.22.92", "3.23.92", "3.24.92", "3.25.92", "3.26.92", "3.27.92", "3.28.92", "3.29.92", "3.30.92", "3.22.93", "3.23.93", "3.24.93", "3.25.93", "3.26.93", "3.27.93", "3.28.93", "3.29.93", "3.30.93", "3.22.94", "3.23.94", "3.24.94", "3.25.94", "3.26.94", "3.27.94", "3.28.94", "3.29.94", "3.30.94", "3.22.95", "3.23.95", "3.24.95", "3.25.95", "3.26.95", "3.27.95", "3.28.95", "3.29.95", "3.30.95", "3.22.96", "3.23.96", "3.24.96", "3.25.96", "3.26.96", "3.27.96", "3.28.96", "3.29.96", "3.30.96", "3.22.97", "3.23.97", "3.24.97", "3.25.97", "3.26.97", "3.27.97", "3.28.97", "3.29.97", "3.30.97", "3.22.98", "3.23.98", "3.24.98", "3.25.98", "3.26.98", "3.27.98", "3.28.98", "3.29.98", "3.30.98", "3.22.99", "3.23.99", "3.24.99", "3.25.99", "3.26.99", "3.27.99", "3.28.99", "3.29.99", "3.30.99" ], "name": "HijriApplet", "description": "HijriApplet", "url": "http://ojuba.org" } hijra-1.0/hijra-autostart.desktop000066400000000000000000000005271361013464700171740ustar00rootroot00000000000000[Desktop Entry] Name=Hijra Applet Name[ar]=بريمج هجرة Comment=Hijri calendar in system tray icon Comment[ar]=بريمج تقويم هجري Exec=env GDK_BACKEND=x11 /usr/bin/HijriApplet --hidden Terminal=false Type=Application Icon=gnome-calendar X-KDE-autostart-after=panel StartupNotify=false Categories=X-Islamic-Software;Utility; hijra-1.0/hijra-data/000077500000000000000000000000001361013464700144605ustar00rootroot00000000000000hijra-1.0/hijra-data/cal-template.svg000066400000000000000000001526111361013464700175570ustar00rootroot00000000000000 image/svg+xml 33 88 hijra-1.0/hijra.py000066400000000000000000000317231361013464700141310ustar00rootroot00000000000000#!/usr/bin/python3 # -*- coding: utf-8 -*- """ Hijri Islamic Calendar converting functions, Copyright (c) 2006-2008 Muayyad Saleh Alsadi Based on an enhanced algorithm designed by me the algorithm is discussed in a book titled "حتى لا ندخل جحور الضباب" (not yet published) This file can be used to implement apps, gdesklets or karamba ..etc This algorithm is based on integer operations which that there is no round errors (given accurate coefficients) the accuracy of this algorithm is based on 3 constants (p,q and a) where p/q is the full months percentage [ gcd(p,q) must be 1 ] currently it's set to 191/360 which mean that there is 191 months having 30 days in a span of 360 years, other months are 29 days. and a is just a shift. Released under terms on Waqf Public License. This program is free software; you can redistribute it and/or modify it under the terms of the latest version Waqf Public License as published by Ojuba.org. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. The Latest version of the license can be found on "http://www.ojuba.org/wiki/doku.php/waqf/license" Portions of this algorithm is based on that found on GNU EMACS the difference is that this algorithm does not set all months to a fixed number of days (in the original algorithm first month always have 30 days) The original GNU Emacs LISP algorithm Copyright (C) 1995, 1997, 2001 Free Software Foundation, Inc. Edward M. Reingold Technical details of all the calendrical calculations can be found in ``Calendrical Calculations'' by Nachum Dershowitz and Edward M. Reingold, Cambridge University Press (1997). Comments, corrections, and improvements should be sent to Edward M. Reingold Department of Computer Science (217) 333-6733 University of Illinois at Urbana-Champaign reingold@cs.uiuc.edu 1304 West Springfield Avenue """ __p_const=191 __q_const=360 __a_const=48 __hijri_epoch=227015; # = Julian 0622-7-16 = gregorian 0759-6-11 (I think it should be 622, 7, 19) # TODO: Why does the the hijri_epoch 227015 does not give the expected value when converted to gregorian def get_consts(): """Return a tuple of the 3 constants (p,q,a) used by this algothim, for debuging""" return (__p_const, __q_const, __a_const) def get_epoch(): """Return Hijri epoch, number of days since gregorian epoch, (should be Julian 0622-7-16 (ie. 227015 days)""" return __hijri_epoch def hijri_month_days(Y,M): """Return the number of days in a given hijri month M in a given Y""" Mc = ( Y -1) *12 + M if (((Mc+ __a_const) * __p_const) % __q_const) < __p_const : return 30 else: return 29 # NOTE: trivial implementation #def hijri_days_before_month_(Y,M): # simple mothod, optimization is possible by reusing Mc ..etc. # """Return the number of days before a given moth M in a given year Y""" # sum=0 # for i in xrange(1,M): sum+=hijri_month_days(Y,i); # return sum def hijri_days_before_month(Y,M): """Return the number of days before a given moth M in a given year Y (0 for M=1)""" Mc = ( Y -1) *12 + 1 + __a_const McM=Mc * __p_const sum=0 for i in range(1,M): if (McM % __q_const) < __p_const : sum+=30 else: sum+=29 McM+=__p_const return sum #TEST: PASSED # test that the faster hijri_days_before_month is ok #def test_hijri_days_before_month(): # l=[(y,m) for y in xrange(1400,1499) for m in xrange(1,13)] # for y,m in l: # d1=hijri_days_before_month(y,m) # d2=hijri_days_before_month_(y,m) # if d1!=d2: print y,m,d1,d2 def hijri_year_days(Y): """Return the number of days in a given year Y""" return hijri_days_before_month(Y,13) def hijri_day_number (Y, M, D): """Return the day number within the year of the Islamic date (Y, M, D), 1 for 1/1 in any year""" return hijri_days_before_month(Y,M)+D # BAD fast implementation #def hijri_to_absolute_ (Y, M, D): # """Return absolute date of Hijri (Y,M,D), eg. ramadan (9),1,1427 -> 732578 """ # Mc=(Y-1)*12 # # days before Hijra + days in the years before + days from the begining of that year # return __hijri_epoch + \ # Mc*29 + Mc*__p_const/__q_const + \ # this line should involve __a_const # hijri_day_number (Y, M, D) - 1 # correct implementation # TODO: optimize it more and test that after optimization def hijri_to_absolute (Y, M, D): """Return absolute date of Hijri (Y,M,D), eg. ramadan (9),1,1427 -> 732578 """ Mc=(Y-1)*12 # day count=days before Hijra plus (...) dc=__hijri_epoch # plus days in the years before till first multiples of q plus (...) Mc-=Mc % __q_const y=int(Y-Mc/12) dc+=int(Mc*29 + Mc*__p_const/__q_const) # plus those after the multiples plus (...) for i in range(1,y): dc+=hijri_year_days(i) # plus days from the begining of that year dc+=hijri_day_number (Y, M, D) - 1 return dc def hijri_month_days_(y,m): """Return the number of days in a given hijri month M in a given Y""" return hijri_to_absolute(y+m/12,m%12+1,1)-hijri_to_absolute(y,m,1) # TEST: PASSED #def test_hijri_to_absolute_v_month_days(): # #l=[(y,m) for y in xrange(1,31) for m in xrange(1,13)] # l=[(y,m) for y in xrange(1400,1499) for m in xrange(1,13)] # for y,m in l: # d1=hijri_month_days(y,m) # d2=hijri_to_absolute(y+m/12,m%12+1,1)-hijri_to_absolute(y,m,1) # if d1!=d2: print y,m,y+m/12,m%12+1,'d1=',d1,", d2=",d2 # round then move to exact, very slow perfect implementation #def absolute_to_hijri_ (date): # TODO: check if it's always compatible with absolute_from_hijri # """Return Hijri date (Y,M,D) corresponding to the given absolute number of days.""" # if date < __hijri_epoch: return None; # pre-Islamic date # dd=date-__hijri_epoch # Mc=dd/(29*(__q_const-__p_const)+ 30*__p_const)*__q_const # mounth count till multibles of q # Y=y=Mc/12+1; M=m=(Mc%12)+1 # while(date > hijri_to_absolute(Y,M,1)): # y,m=Y,M # M+=1 # if M>12: M=1; Y+=1 # Y=y; M=m # D=1 + date - hijri_to_absolute(Y,M,1) # if D>hijri_month_days(Y,M): # M+=1 # if M>12: M=1; Y+=1 # D=1 + date - hijri_to_absolute(Y,M,1) # return (Y,M,D) # direct way, test PASSED def absolute_to_hijri (date): """Return Hijri date (Y,M,D) corresponding to the given absolute number of days.""" if date < __hijri_epoch: return None; # pre-Islamic date Mc=int((date-__hijri_epoch+1)*__q_const/(29*__q_const+__p_const)) Y=int(Mc/12)+1; M=(Mc%12)+1 # consistency check d=hijri_to_absolute(Y,M,1) # TODO: this is an expensive call if (date < d): # go one month back if needed M-=1 if M==0: Y-=1; M=12 d-=hijri_month_days(Y,M) # this call is fast # D=1 + date - d return (Y,M,D) # TEST: PASSED #def test_c(): # l=[(y,m) for y in xrange(1400,1499) for m in xrange(1,13)] # for y,m in l: # d=hijri_month_days(y,m) # if absolute_to_hijri(hijri_to_absolute(y,m,1))!=(y,m,1): print y,m,1, absolute_to_hijri(hijri_to_absolute(y,m,1)) # if absolute_to_hijri(hijri_to_absolute(y,m,d))!=(y,m,d): print y,m,d, absolute_to_hijri(hijri_to_absolute(y,m,d)) def hijri_day_of_week (Y, M, D): """Return the day-of-the-week index of hijri (Y,M,D) Date, 0 for Sunday, 1 for Monday, etc.""" return hijri_to_absolute (Y,M, D) % 7; # /////////////////////////////// # high level converting functions def hijri_to_gregorian (year, month, day): """Return gregorian (year, month, day) converted from Islamic Hijri calender""" return absolute_to_gregorian( hijri_to_absolute (year, month, day)); def gregorian_to_hijri (year, month, day): """Return Hijri (year, month, day) converted from gregorian calender""" return absolute_to_hijri( gregorian_to_absolute (year, month, day)); #/////////////////////////////////// # Gregorian functions #/////////////////////////////////// # This Portions of is based on that found on GNU EMACS #The original GNU Emacs LISP algorithm #Copyright (C) 1995, 1997, 2001 Free Software Foundation, Inc. # Edward M. Reingold # Technical details of all the calendrical calculations can be found in # ``Calendrical Calculations'' by Nachum Dershowitz and Edward M. Reingold, # Cambridge University Press (1997). # Comments, corrections, and improvements should be sent to # Edward M. Reingold Department of Computer Science # (217) 333-6733 University of Illinois at Urbana-Champaign # reingold@cs.uiuc.edu 1304 West Springfield Avenue days_in_month=( 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); def gregorian_leap_year_p (year): """Return 1 (True) if YEAR is a Gregorian leap year.""" if ((year % 4) == 0 and ((year % 100) or (year % 400) == 0)): return 1; return 0; def gregorian_month_days (year, month): """The last day in MONTH during YEAR.""" if (month == 2 and gregorian_leap_year_p (year)): return 29; return days_in_month[month-1]; def gregorian_day_number (year, month, day): """Return the day number within the year of the date (year,month, day)""" if month<3: return day + (31 * (month - 1)); return day + (31 * (month - 1)) - \ ((month << 2) + 23) / 10 + (gregorian_leap_year_p (year) & 1); def gregorian_to_absolute (year, month, day): prior_years = year - 1; return gregorian_day_number (year, month, day) + \ 365 * prior_years + (prior_years >> 2) - \ (prior_years / 100) + (prior_years / 400); def absolute_to_gregorian(date): """return (year month day) corresponding to the absolute DATE. The absolute date is the number of days elapsed since the (imaginary) Gregorian date Sunday, December 31, 1 BC.""" # See the footnote on page 384 of ``Calendrical Calculations, Part II: # Three Historical Calendars'' by E. M. Reingold, N. Dershowitz, and S. M. # Clamen, Software--Practice and Experience, Volume 23, Number 4 # (April, 1993), pages 383-404 for an explanation. d0 = date - 1; n400 = int(d0 / 146097); d1 = d0 % 146097; n100 = int(d1 / 36524); d2 = d1 % 36524; n4 = int(d2 / 1461); d3 = d2 % 1461; n1 = int(d3 / 365); dd = (d3 % 365) + 1; yy = ((400 * n400) + (100 * n100) + (n4 * 4) + n1); if (n100 == 4) or (n1 == 4): return (yy, 12, 31); yy=yy+1; mm = 1; while(date >= gregorian_to_absolute (yy,mm, 1)): mm+=1; d=gregorian_to_absolute (yy, mm-1, 1); return (yy, mm-1,date-d+1); # d = calendar_absolute_from_gregorian (1, 1, yy); # mm=1; # while(mm <= 12): # dd = date - d + 1; # dm = calendar_last_day_of_month (mm, yy); # if dd <= dm: return (mm,dd+1,yy); # d += dm; # mm=mm+1; # return 0; # should not happened def gregorian_day_of_week (yy, mm, dd): """Return the day-of-the-week index of gregorian (yy, mm, dd) DATE, 0 for Sunday, 1 for Monday, etc.""" return gregorian_to_absolute (yy,mm, dd) % 7; # /////////////////////////////// # some tests for debuging to be removed def test1(): global __a_const; __a_const=48 for __a_const in range(0,100): unmatched=0; from_y=1; to_y=4001 for y in range(from_y,to_y): if hijri_days(y)!=emacs_hijri_days(y): unmatched+=1 print("%d years (%g %%) unmatched when a=%d" % (unmatched, float(float(unmatched)/(to_y-from_y)), __a_const)) __a_const=48 sum=0.0 for y in range(1,4001): sum+=hijri_days(y) print("year len=%f " % float(float(sum)/4000.0*100.0)) __a_const=47 sum=0.0 for y in range(1,4001): sum+=hijri_days(y) print("year len=%f " % float(float(sum)/4000.0*100.0)) ########################## if __name__ == "__main__": # conclusion # 0% for a=16 48 65 # 7% for a=1 31 33 50 80 82 97 99 # 13% for a=14 18 46 63 67 95 # 20% for a=12 29 3 35 52 78 84 # ... # 73% for a=45 47 49 ..etc. ########################## __a_const=16 print("for a=%d" % __a_const) sum=0.0 for y in range(1,4001): sum+= float(hijri_month_days(y,12)==30) print("perfect thu-hijja months is %f %% " % float(float(sum)/4000.0*100.0)) sum=0.0 for y in range(1,4001): sum+= float(hijri_month_days(y,9)==30) print("perfect Ramadan months is %f %% " % float(float(sum)/4000.0*100.0)) __a_const=48 print("for a=%d" % __a_const) sum=0.0 for y in range(1,4001): sum+= float(hijri_month_days(y,12)==30) print("perfect thu-hijja months is %f %% " % float(float(sum)/4000.0*100.0)) sum=0.0 for y in range(1,4001): sum+= float(hijri_month_days(y,9)==30) print("perfect Ramadan months is %f %% " % float(float(sum)/4000.0*100.0)) __a_const=65 print("for a=%d" % __a_const) sum=0.0 for y in range(1,4001): sum+= float(hijri_month_days(y,12)==30) print("perfect thu-hijja months is %f %% " % float(float(sum)/4000.0*100.0)) sum=0.0 for y in range(1,4001): sum+= float(hijri_month_days(y,9)==30) print("perfect Ramadan months is %f %% " % float(float(sum)/4000.0*100.0)) __a_const=48 print("for a=%d" % __a_const) for m in range(1,13): sum=0.0 for y in range(1,4001): sum+= float(hijri_month_days(y,m)==30) print("perfect %d months is %f %% " % (m,float(float(sum)/4000.0*100.0))) hijra-1.0/hijra.spec000066400000000000000000000132601361013464700144270ustar00rootroot00000000000000%global owner ojuba-org Name: hijra Summary: Hijri Islamic Calendar Summary(ar): التّقويم الهجري الإسلامي URL: http://ojuba.org Version: 1.0 Release: 1%{?dist} Source0: https://github.com/%{owner}/%{name}/archive/%{version}/%{name}-%{version}.tar.gz License: WAQFv2 BuildArch: noarch Requires: python3 Requires: pygobject3 >= 3.0.2 BuildRequires: gettext BuildRequires: python3-devel BuildRequires: python3-setuptools %description Hijra provides Hijri/Islamic Calendar routines and utils in python. %description -l ar يقدّم هجرة أدوات التّقويم الهجري الإسلامي في بيثون. %package -n hijri Summary: Hijri Terminal Summary(ar): هجري الطّرفية BuildArch: noarch %description -n hijri Using all Hijra operations in terminal. %description -n hijri -l ar جميع خصائص برنامج هجرة في الطّرفية. %package -n python3-hijra Summary: Hijri functions for python Summary(ar): وظائف هجرة لبيثون BuildArch: noarch Requires: python3 Requires: setuptool %description -n python3-hijra Hijri Islamic Calendar converting functions, an enhanced algorithm designed by Muayyad Saleh Alsadi, it can be used to implement apps, gdesklets or karamba ..etc %description -n python3-hijra -l ar الوظائف التّحويلية للتّقويم الهجري الإسلامي بخوارزمية مُحسّنة مُصمّمة بواسطة مؤيّد صالح السّعدي، يُمكن استخدامها و غرسها في أدوات سطح المكتب مثل كارامبا .. و غيره. %package applet Summary: Hijri Tray Applet Summary(ar): بريمج هجرة لصينية النّظام BuildArch: noarch Requires: python3 Requires: pygtk2 Requires: python3-notify Requires: desktop-notification-daemon Requires: python3-hijra Requires: desktop-file-utils %description applet Hijri Tray Applet for GNOME (also works with KDE) That uses Hijra Algorithm provided by python-hijra. %description applet -l ar بريمج هجرة لصينية النّظام لجنوم (ويعمل أيضًا بكدي) باستعمال خوارزمية هجرة من python-hijra. %package -n gnome-shell-extension-hijra Summary: Hijri Gnome-shell extension Summary(ar): امتداد هجرة لجنوم شل BuildArch: noarch Requires: hijra-applet %description -n gnome-shell-extension-hijra Hijri Tray Applet as GNOME shell extension. %description -n gnome-shell-extension-hijra -l ar بريمج صينية النّظام هجرة كامتداد جنوم شل. %prep %autosetup -n %{name}-%{version} %build # No thing to Build. %install %{__python3} setup.py install \ --root=%{buildroot} \ --optimize=2 mkdir %{buildroot}/%{_datadir}/HijriTerminal/ mkdir -p %{buildroot}%{_mandir}/man1/ install -m 755 terminal/hijri %{buildroot}/%{_bindir} install -m 755 terminal/هجري %{buildroot}/%{_bindir} install -m 644 hijra.py %{buildroot}/%{_datadir}/HijriTerminal/hijri.py install -m 644 HijriCal.py %{buildroot}/%{_datadir}/HijriTerminal/ install -m 644 terminal/hijri.1.gz %{buildroot}%{_mandir}/man1 %files -n hijri %license waqf2-ar.pdf %{_datadir}/HijriTerminal %{_bindir}/hijri %{_bindir}/هجري %{_mandir}/*/hijri.* %files -n python3-hijra %license waqf2-ar.pdf %{_datadir}/doc/hijra-python/* %{python3_sitelib}/* %files applet %license waqf2-ar.pdf %doc readme-ar.html %{_bindir}/HijriApplet %{_datadir}/hijra/* /etc/xdg/autostart/* %files -n gnome-shell-extension-hijra %{_datadir}/gnome-shell/extensions/HijriApplet@ojuba.org/* %changelog - Thu Jan 16 2020 Mosaab Alzoubi - 1.0-1 - New generation with Python3 * Wed Feb 1 2017 Mosaab Alzoubi - 0.4.1-1 - Support running under Wayland - Fix Hijri errors - Fix Python Gi warnings * Mon Jan 30 2017 Mosaab Alzoubi - 0.4-1 - Update to 0.4 - New way to Github * Thu Jul 23 2015 Mosaab Alzoubi - 0.3.2-2 - General Revision - Use %%license - Remove old Group tag - Add man pages - Add Arabic Summaries and Descriptions * Fri Feb 28 2014 Mosaab Alzoubi - 0.3.2-1 - Disable notify. * Sat Feb 15 2014 Mosaab Alzoubi - 0.3.1-1 - Almasa Hijri program included into Hijra. - Full Rivision. - Fixes. * Sat Jun 2 2012 Muayyad Saleh AlSadi - 0.2.2-1 - port to gtk3, webkit3 * Fri Jan 13 2012 Muayyad Saleh AlSadi - 0.2.1-1 - update for gnome 3.2 support * Mon Jul 20 2009 Muayyad Saleh AlSadi - 0.2.0-1 - gnome 3 support * Sat Feb 14 2009 Muayyad Saleh AlSadi - 0.1.18-1 - use dbus so that only one applet is running * Sat Jan 31 2009 Muayyad Saleh AlSadi - 0.1.17-1 - reformatting the license * Sat Jan 24 2009 Muayyad Saleh AlSadi - 0.1.16-1 - include an initial English translaion of the license * Thu Jan 22 2009 Muayyad Saleh AlSadi - 0.1.15-1 - don't show then hide if --hidden is passed * Wed Jan 21 2009 Muayyad Saleh AlSadi - 0.1.14-1 - get colors from theme - highlight week end * Sat Jan 3 2009 Muayyad Saleh AlSadi - 0.1.13-1 - add tooltips * Wed Dec 31 2008 Muayyad Saleh AlSadi - 0.1.12-1 - fix 31 Dec bug * Sat Dec 20 2008 Muayyad Saleh AlSadi - 0.1.11-2 - add noarch * Fri Dec 19 2008 Muayyad Saleh AlSadi - 0.1.11-1 - Auto detect direction from pango * Sun Aug 03 2008 Muayyad Saleh AlSadi - 0.1.10-1 - Auto update date - Fix consistency bug * Tue Jul 22 2008 Muayyad Saleh AlSadi - 0.1.9-1 - Auto update date * Sat Jun 28 2008 Muayyad Saleh AlSadi - 0.1.8-1 - Initial packing hijra-1.0/readme-ar.html000066400000000000000000000320621361013464700152020ustar00rootroot00000000000000 هجرة - برنامج التقويم الهجري [أعجوبة]

هجرة - برنامج التقويم الهجري

هذا مشروع حر مفتوح المصدر FLOSS ذو حقوق نسخ ممنوحة وفق بنود رخصة "وقف" العامة يهدف لتوفير كل ما يتصل بدعم التقويم الهجري على المستويات التالية

  • واجهة رسومية سهلة الاستخدام
  • مكتبة عالية المستوى توفر كل ما يريده أي تطبيق يتصل بهذا الموضوع
  • مكتبة دنيا توفر كل ما يتصل بالحسابات والتحويل بن الهجري والجريجوري (الميلادي)

أي الخوارزميات التحويل تستخدمون ؟ وبماذا تمتاز ؟

نستخدم خوازمية خاصة من تصميمي (مؤيد السعدي). هذه الخوارزمية تستخدم حساب الأعداد الصحيحة أي أنه (وعلى عكس حسابات الفاصلة العائمة) لا يوجد أي نوع من التقريب. كما أنها تسمح بتغطية طيف واسع من السنين (مثلاً من العام الأول للهجرة إلى العام الهجري ٩٩٩٩ أي العام الجريجوي ١٠٣٢٢ بكل سهولة) هذه الخوارزمية لها ثلاث معاملات p و q و a. حيث p/q هي النسبة بأبسط صورة بين الأشهر الهجرية التامة (ذات ٣٠ يوماً) والأشهر الهجرية القصيرة (ذات ٢٩ يوماً) في السنة الواحدة أما a فهي إزاحة لضبط اختيار البداية. وحيث أننا لم ندخل p/q على شكل عدد نسبي محدود المنازل يمكن لهذه الخوارزمية إعطاء دقة يقينية في الحساب. إلا أن الحصول على هذه المعاملات لا يأتي إلا بالتجريب والملاحظة الذي قد يدخل فيه الخطأ كما أن مجرد افتراض أن هناك نسبة بين هذه الأشهر ليس يقينياً. إذا افترضنا أن هناك نسبة عددية بين الأشهر فهذه الخوارزمية تصبح يقينية إذا علمت النسبة.

تختلف هذه الخوارزمية عن خوارزمية EMACS الشائعة بان أطوال الشهور غير ثابتة، حيث في خوارزمية EMACS شهر رمضان في كل السنين ٣٠ يوما.

الواجهة الرسومية

الواجهة الرسومية الاولية تظهر الشهر الهجري كاملاً وتحت كل يوم هجري ترى اليوم الميلادي بخط خفيف. تستطيع التحرك سنة سابقة أو لاحقة أو شهراً سابقا ولاحقا. تستطيع إغلاق البرنامج ويظل يعمل في لوحة النظام tray في منطقة التواصل (تلك التي توضع غالبا قرب الساعة) يظهر فيه اليوم الهجري في السطر الاول من الشهر الهجري في السطر الثاني لمعرفة التفاصيل قم بالتأشير عليه لعرض البرنامج مرة أخرى انقر على هذه الأيقونة بالزر الأيسر، ولعرض القائمة انقر بالزر الأيمن

المكتبة عالية المستوى

توفر هذه المكتبة الوظائف التي يحتاجهة أي برنامج وفق تصميم موجه للكائنات OOP يسهل عمل برامج توظف التقويم الهجري بكل سهول. حيث توفر مثلاً مصفوفة للشهر الهجري بكل المعلومات الازمة وتسمح بتحديد أي يوم كبداية للسبوع وتحديد اتجاه تعبئة المصفوف من اليمين لليسار أو بالعكس. إن عمل أي واجهة جديدة للبرنامج يفترض أن لا يشكل أي صعوبة.

المكتبة الدنيا

توفر هذه المكتبة الوظائف الاولية مثل تحويل أي يوم هجري إلى التقويم المطلق (عد الأيام) أو التقويم الجريجوري أو إيجاد عدد أيام شهر معين أو إيجاد عدد الأيام بين أي شهرين

لماذا التقويم الهجري مهم ؟ وهل يغني البرنامج عن رؤية الهلال ؟

طبعاً لا يغني أي برنامج مهما كان دقيقاً عن رؤية الهلال.

اما لماذا نهتم بالتقويم الهجري؛ فهذا سؤال بديهي، هناك الكثير من الخطب والمقالات التي تحث على التمسك بالتقويم الهجري وتفصل في ذلك، إليك بعضها

أليس التقويم الميلادي أقل اضطرابا ؟

التقويم الهجري تقويم إجرائي يقوم على الملاحظة (بالرؤية) لأحداث دورية واضحة. يتم إعادة ضبطه في كل سنة مرتين.

في الحقيقية التقويم الميلادي ليس أقل اضطراباً إلا في الاصطلاح الذي وضعه أحد القسيسين لما يسمونه “البابا” جريجوري الثالث عشر (عام ١٥٨٢) وليس وفق الحقائق العلمية. أي أن التقويم الجريجوري هو تقويم تقريبي وفوق ذلك لا يعاد ضبطه بشكل دوري مع الحقائق الفلكية، جاء لتصحيح خطأ أكبر في تقويم يوليوس قيصر Julian الذي تم اعتماده كتقويم لاهوتي نصراني بقرار من البابا يوحنا الأول John I في عام ٥٢٥ ميلادية.

أقتبس من كتاب “حتى لا ندخل جحور الضباب” (الذي لم أنته من تأليفه):

لم يعطي هذا الراهب التقويم رقم السنة نسبة للإمبراطور ولا إلى روما التي كانت أطلالاً في حينه بل نسبة للعام الذي كان يشاع في حينه بأنه العام الذي ولد فيه سيدنا عيسى وعلى حد تعبيره “هو العام الذي تجسد فيه الإله مولوداً”، فكان تقويمه يحمل العنوان “anno Domini nostri Jesu Christi DXXXII” أي “في عام ربنا المسيح عيسى ٥٣٢” على حد تعبيره.

انتهى الاقتباس ذاك التقويم يخطئ بمعدل ٣ أيام كل ٤٠٠ سنةتقريباً! لذا جاء جريجوري ليحذف يوماً من كل رأس ثلاث قرون من بين أربعة. ويقفز ١٠ أيام تعويضاً عما فات من سنين لم تحذف فيها تلك الأيام الزائدة! ولم يعتمد التقويم الجريجوري من فوره بل بعد ١٧٠ سنة. فهل ننتظر “بابا” آخر يخبرنا بأن علينا عمل قفزات أخرى في التقويم. وبالمناسبة إن الرأي السائد بين الدارسين في الغرب بأن سيدنا عيسى بن مريم ولد في العام الرابع قبل الميلاد أو قبل ذلك (أي ولد قبل مولده المزعوم بأربع سنوات على الاقل)

الحصول على البرنامج

الموقع الرسمي للبرنامج هو http://hijra.ojuba.org يمكن تنزيل آخر نسخة على شكل أرشيف مضغوط من موقع تنزيل الملفات الرسمي الخاص بأعجوبة www.ojuba.org/downloads

يمكن الحصول على البرنامج بواسطة GIT عبر الرابط http://git.ojuba.org/cgit/hijra/snapshot/hijra-master.tar.bz2 ويمكن تتبع تطوير المشروع على الرابط http://git.ojuba.org/cgit/hijra

حقوق الطبع والتوزيع ممنوحة تحت شروط رخصة "وقف" العامة
hijra-1.0/setup.py000066400000000000000000000013661361013464700141740ustar00rootroot00000000000000#!/usr/bin/python3 from distutils.core import setup from glob import * # to install type: # python setup.py install --root=/ setup (name='hijra', version='1.0', description='Hijri Islamic Calendar', author='Muayyad Saleh Alsadi', author_email='alsadi@ojuba.org', url='http://hijra.ojuba.org/', license='Waqf', py_modules=['hijra','HijriCal'], scripts=['HijriApplet'], data_files=[('/usr/share/doc/hijra-python', glob('*.html') ), ('/usr/share/gnome-shell/extensions/HijriApplet@ojuba.org', glob('gnome-shell-extension/*') ), ('/usr/share/hijra/hijra-data',['hijra-data/cal-template.svg']), ('/etc/xdg/autostart',['hijra-autostart.desktop']), ] ) hijra-1.0/terminal/000077500000000000000000000000001361013464700142675ustar00rootroot00000000000000hijra-1.0/terminal/hijri000066400000000000000000000203401361013464700153160ustar00rootroot00000000000000#! /bin/bash # Hijri Terminal 3.2 # Under Waqf License # By Mosaab Alzoubi (moceap@hotmail.com - facebook.com/moceap) # Almasa Project # 1436-10-5 #--------------------------------------------------------------- #--------------------------------------------------------------- #----Main-vars-------------------------------------------------- #--------------------------------------------------------------- hi_dir="/usr/share/HijriTerminal" hi_arg="$@" hi_arg1="$1" hi_ver="3.2" hi_rel="1436-10-5" hi_end1="Y,M,D,W=cal.today" hi_end2="print Y,M,D" hi_header='#! /usr/bin/env python """ Hijri Terminal '$hi_ver' Under Waqf License By Mosaab Alzoubi (moceap@hotmail.com - facebook.com/moceap) Almasa project '$hi_rel' """ import sys from HijriCal import HijriCal cal=HijriCal() ' hi_help="~~ Hijri Terminal $hi_ver ~~ Print Hijri date on terminal . Usage : hijri [options] [args] Options : No options shows date of this day. -y to show year only. -m to show month only. -d to show day only. -g | gregorian to show Hijri date of custom gregorian date. -v | --version to show version of program. -a | --about to show (about) messege. -h | --help to show this messege. Args : arabic to show hijri date in Arabic words. gui use with arabic arg to display it with GUI. gd= Enter value of custom gregorian day. gm= Enter value of custom gregorian month. gy= Enter value of custom gregorian year. gdate= Enter custom date of these formats : yyyy-mm-dd yyyy*mm*dd yyyy/mm/dd yyyy,mm,dd and you can enter less numbers like yyy-m-d . Examples : hijri hijri -y hijri -g gdate=2005-8-9 hijri gregorian gd=9 gm=7 gy=958" hi_about="~~ Hijri Terminal $hi_ver ~~ Under Waqf License By Mosaab Alzoubi (moceap@hotmail.com - facebook.com/moceap) Almasa project $hi_rel Hijri Terminal $hi_ver also contain this two parts : *** Hijri Islamic Calendar converting functions, Copyright (c) 2006-2008 Muayyad Saleh Alsadi Under Waqf License *** Hijri Islamic High level Calendar API, Copyright (c) 2006-2008 Muayyad Saleh Alsadi Under Waqf License " hi_aboutar="~~ هجري الطرفية $hi_ver ~~ منشور تحت بنود رخصة وقف بواسطة مصعب حسني الزعبي (moceap@hotmail.com - facebook.com/moceap) مشروع ألماسه $hi_rel هجري الطرفية $hi_ver يحتوي أيضاً على الجزئيتين : 1 - دالات التحويل في التقويم الهجري الإسلامي منشورة برخصة وقف 2006 - 2008 بواسطة : مؤيد صالح السعدي (alsadi@gmail.com) 2 - بيئة التقويم الهجري الإسلامي عالية المستوى منشورة برخصة وقف 2006 - 2008 بواسطة : مؤيد صالح السعدي (alsadi@gmail.com) " #--------------------------------------------------------------- #----Main-dirs-------------------------------------------------- #--------------------------------------------------------------- if ( ! [ -e "$HOME/.Hijri Terminal" ] ) then mkdir "$HOME/.Hijri Terminal" fi if ( ! [ -e "$HOME/.Hijri Terminal/hijri.py" ] ) then cp "$hi_dir/hijri.py" "$HOME/.Hijri Terminal/hijri.py" fi if ( ! [ -e "$HOME/.Hijri Terminal/HijriCal.py" ] ) then cp "$hi_dir/HijriCal.py" "$HOME/.Hijri Terminal/HijriCal.py" fi #--------------------------------------------------------------- #----Args------------------------------------------------------- #--------------------------------------------------------------- case "$hi_arg" in *arabic*) arabic="true" esac case "$hi_arg1" in -v|--version) echo "$hi_ver" ; exit ;; -a|--about) if [ "$arabic" = "true" ] ; then echo "$hi_aboutar" ; else echo "$hi_about" ; fi ; exit ;; -h|--help) echo "$hi_help" ; exit esac case "$hi_arg1" in *-*y*) hi_Y="Y," ; sep="true" esac case "$hi_arg1" in *-*m*) hi_M="M," ; sep="true" esac case "$hi_arg1" in *-*d*) hi_D="D," ; sep="true" esac case "$hi_arg1" in *-*w*) hi_W="W," ; sep="true" esac case "$hi_arg1" in *gregorian* | *-*g*) gregorian="true" esac case "$hi_arg" in *gui*) gui="رسومي" esac if [ "$sep" = "true" ] then hi_end2="print $hi_Y$hi_M$hi_D$hi_W" fi #--------------------------------------------------------------- #----Gregorian-to-Hijri-Converting------------------------------ #--------------------------------------------------------------- if [ "$gregorian" = "true" ] then touch "$HOME/.Hijri Terminal/args" echo " " >> "$HOME/.Hijri Terminal/args" for arg in $hi_arg do echo $arg >> "$HOME/.Hijri Terminal/args" done cat "$HOME/.Hijri Terminal/args" | while read Arg do temp1=`echo $Arg | grep gdate= | sed "s:gdate=::g"` if [ ! "$temp1" = "" ] then echo "$temp1" > "$HOME/.Hijri Terminal/gdate" fi temp2=`echo $Arg | grep gy= | sed "s:gy=::g"` if [ ! "$temp2" = "" ] then echo "$temp2" > "$HOME/.Hijri Terminal/gy" fi temp3=`echo $Arg | grep gm= | sed "s:gm=::g"` if [ ! "$temp3" = "" ] then echo "$temp3" > "$HOME/.Hijri Terminal/gm" fi temp4=`echo $Arg | grep gd= | sed "s:gd=::g"` if [ ! "$temp4" = "" ] then echo "$temp4" > "$HOME/.Hijri Terminal/gd" fi done if [ -e "$HOME/.Hijri Terminal/gdate" ] then gdate=$(cat "$HOME/.Hijri Terminal/gdate") rm "$HOME/.Hijri Terminal/gdate" fi if [ -e "$HOME/.Hijri Terminal/gy" ] then gy=$(cat "$HOME/.Hijri Terminal/gy") rm "$HOME/.Hijri Terminal/gy" fi if [ -e "$HOME/.Hijri Terminal/gm" ] then gm=$(cat "$HOME/.Hijri Terminal/gm") rm "$HOME/.Hijri Terminal/gm" fi if [ -e "$HOME/.Hijri Terminal/gd" ] then gd=$(cat "$HOME/.Hijri Terminal/gd") rm "$HOME/.Hijri Terminal/gd" fi rm "$HOME/.Hijri Terminal/args" if ( ! [ "$gy" = "" ]) then gdate1="disable" fi if ( ! [ "$gm" = "" ]) then gdate1="disable" fi if ( ! [ "$gd" = "" ]) then gdate1="disable" fi if [ "$gdate1" = "disable" ] then if [ ! "$gdate" = "" ] then echo "Error : Use only one way to enter gregorian date." exit fi fi touch "$HOME/.Hijri Terminal/args2" g_date=`echo $gdate | sed "s:-: :g" | sed "s_/_ _g" | sed "s_*_ _g" | sed "s_,_ _g"` n=0 for item in $g_date do let "n= $n + 1" if [ $n = 1 ] then g=gy elif [ $n = 2 ] then g=gm elif [ $n = 3 ] then g=gd fi echo "$g=$item" >> "$HOME/.Hijri Terminal/args2" done chmod +x "$HOME/.Hijri Terminal/args2" source "$HOME/.Hijri Terminal/args2" rm "$HOME/.Hijri Terminal/args2" if [ "$gy" = "" ] then echo "Error : Enter all required information to calculate." exit fi if [ "$gm" = "" ] then echo "Error : Enter all required information to calculate." exit fi if [ "$gd" = "" ] then echo "Error : Enter all required information to calculate." exit fi kab1="`echo $gy/4 | bc -ql | cut -d'.' -f2`" kab=`echo $kab1 | cut -c 1,2` kabisa() { if [ $kab -eq 0 ] then max=29 else max=28 fi } case $gm in 1|3|5|7|8|10|12) max=31 ;; 4|6|9|11) max=30 ;; 2) kabisa ;; *) echo "Error : Month number is not exist." ; exit esac if [ $gd -gt $max ] then echo "Error : Day number is not exist." exit fi if [ $gy -le 623 ] then echo "Error : Year number is not exist." exit fi hi_end1='Y,M,D=cal.goto_gregorian_day('$gy','$gm','$gd')' nday="`date --date $gy-$gm-$gd +%u`" fi #--------------------------------------------------------------- #----Generating-and-run-main-program---------------------------- #--------------------------------------------------------------- echo "$hi_header $hi_end1 $hi_end2" > "$HOME/.Hijri Terminal/finalapp" chmod +x "$HOME/.Hijri Terminal/finalapp" out="`"$HOME/.Hijri Terminal/finalapp"`" if [ "$arabic" = "true" ] ; then if [ "$gregorian" = "true" ] then هجري معين $out $nday $gui else هجري fi else echo "$out" rm "$HOME/.Hijri Terminal/finalapp" fi #--------------------------------------------------------------- #----Allah-all-thanked-to-help-me-to-write-this-program--------- #----and-I-ask-him-to-make-the-benefit-for-you------------------ #----allah-can-do-that------------------------------------------ #--------------------------------------------------------------- #----With-our-best-wishes--------------------------------------- #----almasa-project--------------------------------------------- #--------------------------------------------------------------- hijra-1.0/terminal/hijri.1.gz000066400000000000000000000011051361013464700160720ustar00rootroot00000000000000ŸUS]o0}ϯ8iJ hj'BGSCL-EnR>\{|60`V( 0ڙ2q Mj[L @rR4%V<⠎{8ŭ~'x7X'&VFˀ2K"_ӎkC5egU(LJvd+u$7u(k& 4l%Np,MDNiؖ$c'RGi=a!'tތ3==^X3rݗooI풬;ۛ+I<7LHgQ/ILʳry!E<,7*ny,G'iE@GS2(_Cjh-o$עNuWnzާ^գמhijra-1.0/terminal/هجري000077500000000000000000000227431361013464700172240ustar00rootroot00000000000000#! /bin/bash # Hijri Terminal 3.2 # Under Waqf License # By Mosaab Alzoubi (moceap@hotmail.com - facebook.com/moceap) # Almasa Project # 1436-10-5 #--------------------------------------------------------------- #--------------------------------------------------------------- #--------------------------------------------------------------- ver=$(hijri -v) arg="$@" arg1="$1" arg2="$2" arg3="$3" arg4="$4" arg5="$5" about="$(hijri -a arabic)" nday=$(date +%u) day=$(hijri -d) month=$(hijri -m) year=$(hijri -y) if [ "$arg1" = "معين" ] then nday=$arg5 day=$arg4 month=$arg3 year=$arg2 if [ "$day" = "" ] ; then echo "البيانات ناقصة" ; exit ; fi if [ "$month" = "" ] ; then echo "البيانات ناقصة" ; exit ; fi if [ "$year" = "" ] ; then echo "البيانات ناقصة" ; exit ; fi con="`echo "$arg" | grep رسومي`" if [ ! "$con" = "" ] ; then arg1="رسومي" ; fi fi n="${#year}" men="من شهر" sana="سنة" help="مساعدة :: لإظهار التاريخ الهجري لهذا اليوم شغل البرنامج بدون أي كلمة بعد الأمر هجري . لإظهار التاريخ بشكل رسومي أدخل كلمة رسومي مباشرة بعد الأمر هجري . لتحويل التاريخ الهجري من النمط الرقمي إلى النمط المكتوب استعمل الصيغة التالية : هجري معين <سنة> <شهر> <يوم> وإضافة كلمة رسومي في الآخر في حال الرغبة بتفعيل الشكل الرسومي مثال :: هجري معين 1434 7 22 النتيجة : الثاني و العشرين من شهر رجب سنة أربع وثلاثين وأربعمئة وألف لإظهار معلومات عن البرنامج أدخل كلمة حول بعد الأمر هجري . لإظهار هذه المساعدة اكتب مساعدة بعد الأمر هجري ." if [ "$nday" = "1" ] ; then tnday="الإثنين" ; fi if [ "$nday" = "2" ] ; then tnday="الثلاثاء" ; fi if [ "$nday" = "3" ] ; then tnday="الأربعاء" ; fi if [ "$nday" = "4" ] ; then tnday="الخميس" ; fi if [ "$nday" = "5" ] ; then tnday="الجمعة" ; fi if [ "$nday" = "6" ] ; then tnday="السبت" ; fi if [ "$nday" = "7" ] ; then tnday="الأحد" ; fi if [ "$day" = "1" ] ; then tday="الأول" ; fi if [ "$day" = "2" ] ; then tday="الثاني" ; fi if [ "$day" = "3" ] ; then tday="الثالث" ; fi if [ "$day" = "4" ] ; then tday="الرابع" ; fi if [ "$day" = "5" ] ; then tday="الخامس" ; fi if [ "$day" = "6" ] ; then tday="السادس" ; fi if [ "$day" = "7" ] ; then tday="السابع" ; fi if [ "$day" = "8" ] ; then tday="الثامن" ; fi if [ "$day" = "9" ] ; then tday="التاسع" ; fi if [ "$day" = "10" ] ; then tday="العاشر" ; fi if [ "$day" = "11" ] ; then tday="الحادي عشر" ; fi if [ "$day" = "12" ] ; then tday="الثاني عشر" ; fi if [ "$day" = "13" ] ; then tday="الثالث عشر" ; fi if [ "$day" = "14" ] ; then tday="الرابع عشر" ; fi if [ "$day" = "15" ] ; then tday="الخامس عشر" ; fi if [ "$day" = "16" ] ; then tday="السادس عشر" ; fi if [ "$day" = "17" ] ; then tday="السابع عشر" ; fi if [ "$day" = "18" ] ; then tday="الثامن عشر" ; fi if [ "$day" = "19" ] ; then tday="التاسع عشر" ; fi if [ "$day" = "20" ] ; then tday="العشرين" ; fi if [ "$day" = "21" ] ; then tday="الحادي و العشرين" ; fi if [ "$day" = "22" ] ; then tday="الثاني و العشرين" ; fi if [ "$day" = "23" ] ; then tday="الثالث و العشرين" ; fi if [ "$day" = "24" ] ; then tday="الرابع و العشرين" ; fi if [ "$day" = "25" ] ; then tday="الخامس و العشرين" ; fi if [ "$day" = "26" ] ; then tday="السادس و العشرين" ; fi if [ "$day" = "27" ] ; then tday="السابع و العشرين" ; fi if [ "$day" = "28" ] ; then tday="الثامن و العشرين" ; fi if [ "$day" = "29" ] ; then tday="التاسع و العشرين" ; fi if [ "$day" = "30" ] ; then tday="الثلاثين" ; fi if [ "$month" = "1" ] ; then tmonth="محرم" ; fi if [ "$month" = "2" ] ; then tmonth="صفر" ; fi if [ "$month" = "3" ] ; then tmonth="ربيع الأول" ; fi if [ "$month" = "4" ] ; then tmonth="ربيع الثاني" ; fi if [ "$month" = "5" ] ; then tmonth="جمادى الأولى" ; fi if [ "$month" = "6" ] ; then tmonth="جمادى الثانية" ; fi if [ "$month" = "7" ] ; then tmonth="رجب" ; fi if [ "$month" = "8" ] ; then tmonth="شعبان" ; fi if [ "$month" = "9" ] ; then tmonth="رمضان" ; fi if [ "$month" = "10" ] ; then tmonth="شوال" ; fi if [ "$month" = "11" ] ; then tmonth="ذي القعدة" ; fi if [ "$month" = "12" ] ; then tmonth="ذي الحجة" ; fi if [ "$n" = "1" ] ; then firsty="$year" ; fi if [ "$n" = "2" ] ; then firsty="`echo $year | cut -c 2`" secondy="`echo $year | cut -c 1`"; fi if [ "$n" = "3" ] ; then firsty="`echo $year | cut -c 3`" secondy="`echo $year | cut -c 2`" thirdy="`echo $year | cut -c 1`"; fi if [ "$n" = "4" ] ; then firsty="`echo $year | cut -c 4`" secondy="`echo $year | cut -c 3`" thirdy="`echo $year | cut -c 2`" forthy="`echo $year | cut -c 1`"; fi if [ "$n" -gt "4" ] ; then echo "عذراً يدعم هذا البرنامج السنوات الهجرية حتى 9999 ويمكن التعديل عليه كونه مفتوح المصدر ، فلا تبخل بتطويره إن رأيت الحاجة لذلك" exit ; fi bel() { if [ "$firsty" = "0" ] ; then tfirsty="عشر" ; fi if [ "$firsty" = "1" ] ; then tfirsty="أحد عشر" ; fi if [ "$firsty" = "2" ] ; then tfirsty="إثني عشر" ; fi if [ "$firsty" = "3" ] ; then tfirsty="ثلاث عشر" ; fi if [ "$firsty" = "4" ] ; then tfirsty="أربع عشر" ; fi if [ "$firsty" = "5" ] ; then tfirsty="خمس عشر" ; fi if [ "$firsty" = "6" ] ; then tfirsty="ست عشر" ; fi if [ "$firsty" = "7" ] ; then tfirsty="سبع عشر" ; fi if [ "$firsty" = "8" ] ; then tfirsty="ثمان عشر" ; fi if [ "$firsty" = "9" ] ; then tfirsty="تسع عشر" ; fi } akthar() { if [ "$firsty" = "0" ] ; then tfirsty="" ; fi if [ "$firsty" = "1" ] ; then tfirsty="واحد" ; fi if [ "$firsty" = "2" ] ; then tfirsty="اثنين" ; fi if [ "$firsty" = "3" ] ; then tfirsty="ثلاث" ; fi if [ "$firsty" = "4" ] ; then tfirsty="أربع" ; fi if [ "$firsty" = "5" ] ; then tfirsty="خمس" ; fi if [ "$firsty" = "6" ] ; then tfirsty="ست" ; fi if [ "$firsty" = "7" ] ; then tfirsty="سبع" ; fi if [ "$firsty" = "8" ] ; then tfirsty="ثمان" ; fi if [ "$firsty" = "9" ] ; then tfirsty="تسع" ; fi } if [ "$secondy" = "0" ] ; then tsecondy="" ; fi if [ "$secondy" = "1" ] ; then bel ; else akthar ; fi if [ "$secondy" = "2" ] ; then tsecondy="وعشرين" ; fi if [ "$secondy" = "3" ] ; then tsecondy="وثلاثين" ; fi if [ "$secondy" = "4" ] ; then tsecondy="وأربعين" ; fi if [ "$secondy" = "5" ] ; then tsecondy="وخمسين" ; fi if [ "$secondy" = "6" ] ; then tsecondy="وستين" ; fi if [ "$secondy" = "7" ] ; then tsecondy="وسبعين" ; fi if [ "$secondy" = "8" ] ; then tsecondy="وثمانين" ; fi if [ "$secondy" = "9" ] ; then tsecondy="وتسعين" ; fi if [ "$thirdy" = "0" ] ; then thirdy="" ; fi if [ "$thirdy" = "1" ] ; then thirdy="ومئة" ; fi if [ "$thirdy" = "2" ] ; then thirdy="ومئتين" ; fi if [ "$thirdy" = "3" ] ; then thirdy="وثلاثمئة" ; fi if [ "$thirdy" = "4" ] ; then thirdy="وأربعمئة" ; fi if [ "$thirdy" = "5" ] ; then thirdy="وخمسمئة" ; fi if [ "$thirdy" = "6" ] ; then thirdy="وستمئة" ; fi if [ "$thirdy" = "7" ] ; then thirdy="وسبعمئة" ; fi if [ "$thirdy" = "8" ] ; then thirdy="وثمانمئة" ; fi if [ "$thirdy" = "9" ] ; then thirdy="وتسعمئة" ; fi if [ "$forthy" = "0" ] ; then forthy="" ; fi if [ "$forthy" = "1" ] ; then forthy="وألف" ; fi if [ "$forthy" = "2" ] ; then forthy="وألفين" ; fi if [ "$forthy" = "3" ] ; then forthy="وثلاث آلاف" ; fi if [ "$forthy" = "4" ] ; then forthy="وأربع آلاف" ; fi if [ "$forthy" = "5" ] ; then forthy="وخمس آلاف" ; fi if [ "$forthy" = "6" ] ; then forthy="وست آلاف" ; fi if [ "$forthy" = "7" ] ; then forthy="وسبع آلاف" ; fi if [ "$forthy" = "8" ] ; then forthy="وثمان آلاف" ; fi if [ "$forthy" = "9" ] ; then forthy="وتسع آلاف" ; fi hijridate="`echo $tnday $tday $men $tmonth $sana $tfirsty $tsecondy $thirdy $forthy | sed "s: : :g" | sed "s: : :g"`" h_gnome() { zenity --title="هجري $ver" --info --text="$hijridate" } h_kde() { kdialog --title="هجري $ver" --msgbox "$hijridate" } h_gui() { if test -x "`which zenity 2>/dev/null`" then h_gnome elif test -x "`which kdialog 2>/dev/null`" then h_kde else echo "لا تتوفر واجهة رسومية مدعومة مثبتة" fi } if [ "$arg1" = "رسومي" ] then h_gui elif [ "$arg1" = "حول" ] then echo "$about" ; exit elif [ "$arg1" = "مساعدة" ] then echo "$help" ; exit elif [ "$arg1" = "--help" ] then echo "$help" ; exit elif [ "$arg1" = "مختصر" ] then echo "$day $tmonth $year" ; exit else echo "$hijridate" fi #--------------------------------------------------------------- #----Allah-all-thanked-to-help-me-to-write-this-program--------- #----and-I-ask-him-to-make-the-benefit-for-you------------------ #----allah-can-do-that------------------------------------------ #--------------------------------------------------------------- #----With-our-best-wishes--------------------------------------- #----almasa-project--------------------------------------------- #--------------------------------------------------------------- hijra-1.0/waqf2-ar.pdf000066400000000000000000002072041361013464700145740ustar00rootroot00000000000000%PDF-1.4 %äüöß 2 0 obj <> stream x\K,rޟ_QkC-%$pw/5ww<$B1=C> 'i?~?=Ο1Go~hϟc~F81׬#>ͬ~UPFŧUMs?O_yԳVO5ݬ0eV;??Ͽ!>Wgc# 7[.("y rt i@--}znC''!YȾxQ%9n43dg9ܥ+?]7_O[e.[./$*3=mRY`D .7S8Rg 4/ l(̒"0Z!UO\m ʯ:X4`3$ͦ͡yU , .Ovnlx:p(HLpI6<@-Qc]q 3N4n{J>MQpg>6kws?Mj;Mq6aL&Q% ,3o6fqYpRXl9d?s?t'{s. n"r" -s'Ȕ)٭xr3i6(Gaǝiߤ a>dW=Gc&.V ٧s+^χ?ƒtk ^Z/f7,R'ĂY^y z7 e=Jw_eAj/4̋x ]9R-I_@tkS`rpy2 xR`9V2#d0Jdf5no PFpN٠{,퀬>UຑP@i:a p&D9?9SbQ|Kfnw[|FUyF$'*$jaW6v- HPY@P!*4 l* YXC ME'H=1\w FGdqH]($ASJt8U&t..q}ɱNdX|eఒ>>T;:2)%zz"_8i ,lz]p nv}%B"$[5A43M .ֺiF^|˒)WYR;4r p3b@Dq ~Jypr'? ͨBa -/($DA ag;,ÖE#yӖ_MB)^V`Seo'e^`9V*ArPB _poW_v* 5ԑf344 MEC,*#l_/rUOʵ'j09gA}!b^2@ B5J_;C[)6U)d9ǵo[4L:VAoxy3x'mBL+\pE`zOɔ }lQuqg|!ZsmphXLP^3omӓD 'vWmrlfSSyZ`:p}RK6Bb T"Hy@t%Kom6BdZV4o}] `tMęT 0C  KpK@v;vEfnv2;.s (qȢHmGDR tB.)6~V%q~irxa@ϴIX*tLx0%5=n3,i*0 {Wx=~3ϕ,3h<L4J@G$Kt(3$GgI~=B]i$1 w;0^%MtlL$C}Eǚ KeQ q(?&l̙e0}WLs]{RUu e!!5㧯 ߺp4 9КP614ԤH`foZG@4"aBNO7oq3lvpMź"^;P ɥW@/!^LF(r{t;6!,( ʼn?ѦO>}Ulhсgޏ.)l@QDՊuBwJ k}|Ց(<)>!lGą)gZsZA҈~|.77wx V&6|%eJ)\3./XP(EX12ɰvafp2}wĜ>|o)Z\ӼMS" VlO *U:H'ao (Slgڝ3LSl)FѮXW.ڹ68Yw|V @_d 'i,tI1m&,dpBYr%]ߛi@׍! ͇і@:b1+ ʬ-`]/v~F 1auR,WuIj-MNy>A_kA,(j2WWh3( ؞Wy2XQI "-IiC'tɚ6,EG{8TSҠt]Ik^fV m& #SM\{,X҃&9"\TTG>tvMr+ѶM!6I%﵄x8`x5#n%g)v) n.%4yɖY Z2ns2)ycp? |]o0.໎Yߥ("fP q&)j5gx1-&mZGv|%W\h׶7Aṋj$.1jVrlfb4hfyE>P ( <^4sC#;*:`*P@nmoۭJ^PA,xcea,?">Κ捆ؐN-\5h@ eV+TnOn$"c& caYiF5T>bD FnfM`KC\WÝ{J/^gY9۸LZ쥺XɻIE_cR3lTcOڑO(H=/gP;(kx=<&jd &Y_[9S;PiS;M`tfq].oH[C̙sB%:#@ukOI' s!*/cfW+md2ch.)֮2ӑwֹo+hkz#sK)qVu6ئbԺ\$9[~^iAay˗#sYff!-@b܎DI2$ە*GO~(03uT~H۱i-XYvpMJ>}jΕ&lAg6IR.-'F}aL䙓joo)k}O|jsԆxMM'\;ӉKw[1tdȃvoʓB&ߚR!;ReӨ] K3BMГzfXJ7" foN8|;|۵5! L edP1:Dn_z9w:itC* j-n2%xf:diOIM<mxgzR%Z]!b#kѶ~#[}]X^}= DxmA<.+5ĵkM٨Q$'{ISݿ*255{嵑Bly12À&{c1|EzΥwÜ ཅD`ogA}\OU[˺ |0(4|R|<G!r]ERRşI;\/D鿾,ԍb{s?`قkDҒE7r,޳3r߅ZM7>5=u\2i(%]xӂ\t!$nk\.T9]z60 +`RJr*~Ptv,:gnAPJZ}`s[ϵߨf%߶0h0W>4#۟>=2ˠv2#tbu3L fךN%{XWb8#0אDt MMyXLCfLOERWm22n6B-ot04X{ٸ&~sLv QK n6q҃)]Dג ]Ii8 -/Ϯ|`dL{ʂfs\CK 5h[^i8C|wD)]K]@m'Y@g!yNpWzw]a+쾕 6bMܻhP8{< ]`U4]B w]h"E7{o<(>ɸ2Si6߽4פǚMu=C+6c$?D mǥ˚XX}Бآ ڮJΣ2BV@״{^NvǷ דSԘ15݋xe"jW2di@Pw$Կ4XK+j,fD\yDHLen6γB7"&[& V7r7aheHJgnn`??~?~R endstream endobj 3 0 obj 5695 endobj 4 0 obj <> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 5 0 obj <> endobj 7 0 obj <> stream x\I9rOgCUk_ Iu|(66>O,B?5=R(E(է>I|攜L?ǿo?Ӟb?vOڜ~Yhc|سI}6y1gmQ/ 9?/?4OΥ\L*Nq&.&6a s͝>?zS9ßy.0eÖe0^}Iņ0[Mڶ@ɇ(#]-Vçƣr>8 mY`AOu,' ,:./#7X~<⊎-:l6e[G+IQ f}qe^Y Ŏ6vmo㽌>}؜$/{K!=HJ>) :P hh 0*Jۡ@ɱh+OEiG ?Ѵw=>w5]PGtvC/t (4 Q=6O*a"WXj`y< <1Oku1W~ q C׾!ѹ]HJ5qqU2ݾ:o-0ƀ}i`%vs|o`yE >|1q*b0HTH`Fk~k@.݄Afۗ2wuWSq!5t4a9g[)3t|JZǰ,[VG1qMaJڐWrFGO,.n<(@ȶ^ơ3I簔9٣< ro5E( U7^au~Asq@‹:l/K>0?Bѷi};2@)rFιt#N59=Q [*)n ` fꔤ}Urn)k=XVNb0 bco|?VXCAM! Xk?;|;QpX6G䧽T >R4y+J?Ӧě8UȀn}dNUc3HLnlum 4n$*ir&NŚRtެ;rfN;HNGFtK.ocB!bҷnPVCe*|9h7X Ohx+(3*٤fsK\`sT@;6Xx,掉@o@20u"".2|d B b_'z7L\ç)(=!/-@+Ƀ_/>f<c*(]15<6:DtKU*stkXǟʍP,el&cE鹼!GZ(lHq*;)ԚnDrع ӽz㦢HFZVEح0y@af.-ؿN}G>-D4!lϾKb̡0RNo}ECxMt7UվVۛ=!mӠFDPm\A^U3˼QaYo'v%}MN(,C7eHgF3ETQ=4E?XK sAH{)ƥ#rsf: jG<@K}4}Ł1,(v$;WeSZ-]F ⡁j5{k|1j Zc,L" ohI4M;tld٧ Ћ3jJC;*3PEa{&+NG^sd>7[ $A_SN (lQhh/E5/npmlvD'qd6TpM*;Fzq~ā$?gXt۵1- 9V߰HL%J+CC0OKqQ9A={yEom$9YfjKT00, 1`6(aWr:f2E]F6TTb@DΌ6P>[f9}S[(i1Ľ֤v/ :ZFHoLW-((I)T &3Yml\رDaJP jI=5&fb9rck5e^ DۼR;h9'@&L~޹Z [,wBT7·T+ۆW^Ɇ@rJy0hkjPmrKiZcN70_1?vIZm T]+%AlRpXyWlXب˘9]; wغ&yc}S;1WYKrnB[C"z_i (N!pF.L(~老E\}X.a"!dgvxOV1mPJOwDI`fqt1a{G'&ǁK+XR3L1TAhD֌:>p vT#Y xzB(<^nN1e upNKJA9t:B3q;ά|MvnK-9P S5{v0 XCqb8:w8:Kafn~"8LJއAp=놞S'DBO7vzfJ[$T{!4b#I:ԶDߠG Gh|l+5ЁZ,Bz|? (=~9od*;̮/^WF @#w߱9^mX*𺊶k9i C\facUb4S"{?)a5?G ܕaBtNK+[a GEȄ̞QLhaldzy(=*@&$YCS[Rq'?q87(\S5ax_C|YPjie6Kxw#cRK`H0Ƅ\v_6 =4:^(}f̩L?QגV~'_<Z]p{}SGd 2vڤ=3΅!`}w0o6 !hmOg}E3LTFu F|fҨ/_/ao~􆧏*JYrK{˰O$Ks_K2(ސžg 1p+yB;a9ŗ:y 5s`1ct}wq5EukGvS$P>^4̸ ?2w9n_##eA,ac}GdDJ8)dwtȷ^vx7'8@O ^Jn6]^UviJ!V_80Og3:t]0|s HEw0{.{3{ICA1!i>u9`u 24†6u=4Fʯ}i.ō]D4DLM͎}&\*:~L6vsJ44A l]p10V{2ƷeyX ݪғ҃VPffy_@,e/uoj3ua_M.K+`1Hc$C6eE=O+͚}~_M?&Yע endstream endobj 8 0 obj 5294 endobj 9 0 obj <> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 10 0 obj <> endobj 12 0 obj <> stream x[K$ϯaf|X|-#"53#v۝ųԛE]|ٿKr-]~_tw 3ň+/\ۢL=W _i߿hJ_\tm_^_3؀",GUWr@蛧E닄m,d/h?M 0PK'*#%' 'Zɚb?'AGUA w2be-HAz/]WSф/7|y?]z ,u:K۪G7gD i9,_6f|Y7.s^ܭ P2 ?b4C>D&&/zho!!pu)&2ȅ mK5 87.D8v[=07'$5}*J$pPYa2pn`״uY o.TTkSpA3Pi8_rS?gf:u%ti_,Z1d6 XY!8:HĄӼN oH@+@ۭngb< # [1Eri+B7ej U@B@UDIvI:Dvph:FNt ; -"r_ƜĆ$x} [&뇏N 5Kd|=%ơgPg vٞ7^c:= q2FS6 +}5YcA9rP%?@@^: ːVZQ2y Fc l' tͬQڨ'0q. MBhGV#GOZz~YJ{G;n3-+u9vFB^1$k "k | =oLĪE*Tb&#wG"Iz"CЀc!_ ;_i !ىX-|xaE؏څ7;gcE8j /q6=a^*h+x8OXp_&RO@"ހ*i rB1t U>4 x0iڮE LnBzGO0q|-:b\'Kz~`3D1N 8QiyS"tQ* HwZ >ՒREgW%Q4cTfGb^+3.c,/P9Xڱ]鎺hkb4J g]JS^2uB9>XkC Qu;D2,Cf xq#60P3ϑGTD)EkeZ:OJcTa0ĺ"E;guYHiVP{Yi:z:C|?ǛgľG%[8 4Tᆉ>A&5pߗ RA=LȚ4H[A}et+ք8e*0YBVE0>}O? j,c[+ wQaˆgή,KD'x{sp*Qi2D *,F)(/F OQ EVIϤVLFؐMа5N+.OQ*']IQI:8{"ѓ> dV]rol5CıVotNƪұ0ϩ6 vl.!lL% 3wF b͓6t:ewM)tL*d!ΏF1qe{wU;w$Rm@-P tU'Ii݇ ]s;G1G}A$ˇ6wG 7Fq 8Sd'q($(_GlQ}Rk< E|u@#7hAH'#/zeh8U\M)#$v|HTIr55=iת(gP3W'թh2u ýȍ5Ӧ1iʙeڳES`Oem+,%^V]65- r/Ն ژ>S6E}b׈Qu RBO4$iN&$"F:7-Hiwpk)[c,NǑO;*xTB eKPKOxJyU11ﴷ.M ^Ό3#p.L]ԌEG?$m9l;pqOGv#A8 \j##16Z_zl[;q E? Uixsz.q6!&B\9Df?S۹ +K׭h'CZӃ &'Z4(xlnykOur˥.fYâeLɧ8>[J4qm$7 Ղv5>1B_T}VsW#>oxN>r0f}[OЖ|7f#muҤzp]eaBJ,GH805 %Q&s<ůY'(28~r;uP|vu6)xvJ99UzHURtܺg{J@Uir>yQd!;k"׾jT섯+1z.cb(JCA$ D-F2Z\NK|ڤ)3N|Ek]^WƵ_#|~ a_.^> /Length 8 /Filter/FlateDecode >> stream x endstream endobj 15 0 obj <> endobj 17 0 obj <> stream xw|T?|fNݾ{vlnnMF $!BB ZE:HQPDDD 6rE\{\*9'{=#ϐ|Sޟ2gтS )s&ۻ '  S,*Dwj˦=rbG}S'uM1!>4p?!:7gѲ_}  92{I #sΤeS V'͙yrw.Kbļ M#6C˹ SmC=f_Մ4 } +!vI /#D)DAD"FD($JR D-QO4D1h&ZQDN&N!&)Tb:1E!Bb1XA$V#^#.'6M*jbq-I"v{>V6N. q8B<@%$"&AX` X. kzp96+Vp;Np=v6pCntU\KF$%7&A[Gz}p᜿>1B@{s $ qwtHdp' zYBOFO0m{L;z{r1={,OՋ?0iO3gr])g uzA ƉSe@=Wӝ=5zpzj5/ôsS%DOo4*Q  atvY@`O$?Hx{fY_.L-MČNd5j>gŪ] Bސq3SVH# xHlɦe(TVbЦ/Y]L,  ta/aN۪>A>B^Z;Ć>K)].}e@y8l" x鼢 Qh$^d$ VȰ͑ 1*3o ԑ^ƒ<>=Η$-B=0<G+KHdl0<<;>1pT/믴-=jSgoq)v l/+G$sD^ Iw..ZQc`f沾wCt~wtk7X)N>iɯr!fLr)Ӓ>cK*GVLLU4 8d3[\!?B%۱2ǰ\躬$KWoxHUþ[NH3ǾS9d{0=NL 9}/}gt XǺΟaBtVW o+bX0:+HS`( tf)8,'BlHb.ذ$6KZJV?0eq|h&b6^1qW,] =Hv`#ρ`Ț(,m&/r4E Qn2cJXƥ80n`wģѻ_@r'8I>Lމ*&6GqaiU(KN{̙IIe>Qejn%# |I˖t< $GY#1%5%x~XWy=)uuT} }=2}?r*7Cͨ!޸2n0twwFk=6gH>F˲9b!nT)o #^(- &βLew!9nǾ V  ȨZl ^񯁑v2 $, ,9kJu6ud-#n(Zar/- N\?8+zaFFPnl8غLioY<9:n*SޡojR`c452o<4+I]?#*N&Ӑ?:}s)ϓ}v>XZ=>  5_E:Ao/VLz8XCFVHI{cZ쭥̈́,k1$kňPh¥0@%,B U_EkX^"NĆ;8ʻ%FLol F-4{ef ϣ-AI& ;İh4-lХ9JASvMu}f~YތI2B@ᙑ$|;=ćϑB|H&F0+X&vq$;0|R5hei>i xiYT4Hy'׼RkPl>x*dăbOePHf)v $ȽKrqo˹=&nd-9z|jF[дf%94 ߢ9\~!^ӎ׊c4+ 7KP?e=!A+ ^ igL2 oXd6dp}IZ/TdetBmAxf0TkLvY\e 8ܦJL82&c`81nhWz \R*ת~ŋbB*BQ$p8◜dXXC-oPQA]?6fG|a،:Ղ$,D먑֡8'9MI3 ܦj:xko. _⧍г+8)80mKb-BY'}BcOJIC}Ŏ,Li "Vk* ]UM,e9UL%HN> U)6Q|FoߴkcԳ9vI Ml6љ\1B1Gf^6XQSO>#.kV.SG>So~Fts ZGmXll=!#ɣz |U$Yuk/~K/qfgFJ_t'g-JzDX'9Ҽ ~HnX" CmѻJk&P`!`q-j,ϙj\H(uYRdgl2%w^7߳|>^1N0/%8 ?6(RBVOZA&%㡤3\lA*gakz & >ȘH2tןĩ*Yȱp)dcC+'t甒_\q~Km B㓕JTC㐗&bHO`lS@5 SϾ:s쎒v82&B >oB۷ mX ׌cU3ֵV^\=ӫb&GhhQ@*ѹgFF S`׬ΒUiVUIu)SrP$.plP)Lc-Gg4J1 & aX5_Ub`zQ6."a}*mbЦϜKb+`5wdiߤܕ2?7f^18B rb;AZ"YHakm2"HF)UOo{FwQ3}U&Jq3 0H4|*|Gܱ=Zo]cK\5[FmdG{sp xwdWZBsoKֈCa~j<Pze*{ᦶ8L.[Z$trjWi̻Ux H^#yWOP `|]R!4dAV'iMgo6KiW (\BWo]8D:=\OzA6p'ae;2_#؎Pu,gCPrHȴ3FXS"PTna:W#%['e@Β$L0j9'zH6#˖І3e@(hD5$C"<kQ2f]SZ`1w,빣sy9n4 ~}]o0>]p%ȈFH>ړ}jѴ4NZǩN0hbWX~xi~OldEd&s]2<<5.i) Kr 8 ͳL)G܀Md$",c6Us wO:nBuG*k&go%дi!XjyZsR>Ic.Se'% JKQ;#`( %r T F3d gVL.а7otGf!'eat +aZ+ג4[R'?T}K,B))z2nn`3zE(>Ѥqd7Z=SCLH>NΰwsY z zIF,/4 ZխW ܋,-&#(\}0/N_pnO5Iy/ΡjFذBA5Ng789*-Ohgh,4I;63K-LZS\\Eq7g'{ͤFZ8)>@N~J\_6DIJ6-Ne9zTC޷IxtBn`sJ<(DPQk: RÑ4_jrX4eK&[<͈i{dJϗ2B"u/}?Xf|9۷d?}5j+hԞg˿SI8qM}ylƱRWٔ;m?Co-4GR+ZPTMl"^hW*]q!W׃|k"2dR0_(]PէWlRL\|qEU E p:e,?}-, |Iob},MTPkLolm/*unө/KuS!>!/7j\#Bo磔`sMf}Bt>7UIS3U˯i:2pBA`N5R>St@Ō'Jzq~}]}x/q\I r惢)RAJQ@pV<"KK-+LxŮ{ MYL~q^Y9#ʙ5)?M`--궧/~ǰnjzi'rr 6=Zu*e@/l3'AV;5:.C ٝ7J1\ u@Vk\w1}Ӟ+5U. T[͏̉sg^%^i)V B!@DxE0d1!K*m;?p Bf |*k<̴w,6L_Lfx!prUDX6:v |䆱jX3G8u'2μnD% ,W>\KNe Ns 9AKg s̽ٲ!nghnW|Y#$W١`y:iYVg_ :v3=#uZbDacD 6sL@4-SZ=ѐ e$ʰE*TW<-^7^+|䕺̠ig*oiha6+ ;j6i2F=`5#s"`J]vդٕt3?0>_Ho<0έR%Pm|H"n%bKrjǁo?woKgRo;FR7#Mjݕs6ż:A)t &`W1 :𥸪 3ŬB#ɹBc+/$`(3n_GECiGӣ1ǣ6S/ƃ&3teᄩ:MqZ},6bpj?[nKF 'xcmsznkwOcYg'm0RFħd>)40=ơ)G)mѩKylf{QJNԃsFF^(v1֠]grPh=TNH2>;b m"O@&Gk2.ĘA/2vOia߹TYpBlA Msg < Syx>E;|K;[hG$Ph_dihETSP5#:ÖF TԤxodZ\企 n(HfMFT 8pcİL9hM[y/NWoͳPVӆSM0!̗6?W (p9 -d&c)4BȖ m6!!(1+KْF{/{PLToCaVkAP2d4!@%Zg|{XS5?C6HY <`̊PY>g|'#{/ 62.OT_)}Ah;華'e^}p?u)' B…FqKjtFK|PhYNX8Y%O=3,SqKk&wbǴv'~g&Ҟkr>4߉w'&4ߋ %ZVCIaa=l0Qw|JV;,7Yke陳=,fOT8ϏO_RqAߔC G!9qJE|Hh੒CB Js_o!̃V@ uϊ^@ϵ\zygJ,IVJwچ##G6Y6iQ12P^ Nl~@Z;`ΞdJVKw>&4rNeĥ*-V]ܓ$x}Z8GfiO33ⶀB픒G+y^ XD1ϙ&_~%Ռ>C.El@N8(Y3/*2 bL0OuDeI]!.țNnp4}Zog.6<з2:ʡV}h-x-Z׮ poH&;8"!TK(9UmK醏Q+-Ykƭ'`:dSl ՞(7XF65>婫 ޵=(oE)}9&|e ;W Ǒjm]^z֓%ódJWS izn&*˫ƅ )3CfX2ngzK5Ƶ[}B1"L.ssB2֔M[y M7^-3Ȁ*iĜiI$h GE3NcI`7 LGVY=|D_ % |&Co]iO ,hdf2&LFgp) fxnQYd_֏FYkFu;@AҼ -ŏҍ02"H7Jk)@3l,pV١g.  i|4;,3z0y), 0P7#prVvs&d0NcRiϗ]E93T;%cQm1MF.yiZFWGAYADL>8 Es"Y; `u^R3>5[\={[3Wi$֦'օ$ôr, hXVv[tРQru2fb,V^)g%Fܳ@\(Dzfԃd.7&_p#1=H:`2L*Uzp-kHyV,> [&(qnk<ȥKjÿ$XB.|FQ<,EZ-ORRyI吋g+p !VS2Q>PjCr)Zߘs!#4ݟ4a䨈yBZS?,I2` 8J{_KXvXɫ|HsID<5f:3.K <٭ZGV1e=LF6g7ģu߂#L;%"ZfJLn b~JfLoW ߾*?3uM!GҢt) LcR $6Fw9PDCj8Y6AʷQ%Ì`"MvF!sA6X3ߖj f-眽nSSj8w7~1qELKR{n4[OiG?2-ݥ*1j(e'E``":SIѓ٢1UӋRAmϙ{="_/U*@߀tx$7n˨0>7~u+g{4t tq|4q*7AyV(+5MEק蝱7Rkpn2}zL? F{U|tfS( j -ufCݮ$ͬݿ+9{2y&% \4utРp^>Zُ|>q!"_cRB{&#DU2_-S/S; [EvQ]vh]^4O~"wAޔ+\;M:g/d |ɚEA -ZY!4q'ВslKHVgPa8qU:fZǙ`ja.]zԾzfUxVe:8qd_7W'RP΢Z/eo$%3>~tLM#OoOg P{4@P{) -ɪgF8-O3pVd2rZ23jN 'SwnSM%֓k#5mBΎ r#pEcWl+A-N O.tG(m&uu1>ur [bNW =[Òݐ(I/MhqX,+0.d¹h* NQ@U+ģ Up ZG #80."^7 # } Wk& ~YԵNYց}jcIWe{{'ݣ>&rd 4yx5Լ< t& %YvG:i du4d2IY&Fͱt41t1rURدx97 8²8!dgYF 0_L);83mvŅ8̤ W;U܎Mts -h?7,B}Z[Dq΁ۋ֞\4=ط'lAC,of\kb8GtNMӑ/J%q|+%\r-H$'0*ͽpGz3Z B#\meӇ.mŰo+ɽe \GV܍`u½gl$ n+)^ uC5²'bb@E>?,${Eu"$_lhBz'}/HdpITBZ~f/Ba~leqξg&CM{ZtiZ[G=0P$%hǽ7VnYsIIy|/딞Ե zJiP-@ xlZOoZ;וk;o .Gd"0|ɸgvQ|½ a(ֹ/蜚8315%D1Mq&(}r(I<94LgĆSHc&6zY}; صup7{-]s؃TaX0q]WyR5È}&nBcrPV8,2J ݺ$.PbO~Vğ^+ݑ9j5.Sh5rQ04V^S/KV=A+ %j%4n牰uYΌq(wf.}Qu3gq1޺y4ȤnWV:LJC#d̓_Bjy/ K|Qh)'{!'NW(=ɁKSZ?kTY4ХT@jۗ2zF386] Ϡ; NY< RiT~R_+,|K[$0TrBgVlc1}~ ;%hi ni3[S";P|H㳹VeA=aD:ed:Oa $$a {'x]Üw=&hzP:Ўo'ceց&_'z›O 4_RWO0ŕ&Ȱ 9OObSĿH~Wc]?̝Z#[Zues4`ǒ@U{ُ0hU dthNƷw"Hoϊ+x]Nj(%3\qZtX5 =rdVۓ i03fReA[92y\IV?(6FH5+4NB^%J'l%%jFGH±.ۮݕܳQlcz򖰹+\!yV81C͔{6$%Wh@?iE ,WԱN'9<{6]*.>if2guI9^nY ϒ^*Yz8yV;rމwCKsǐB#kW.nഒ@^?ufs-h7y`ζPh )/!{sIN{[:Sv{](8;`h:Yd^U%EvEm/(9$ZD]N,RUuwW m{z2뢛2$9_wrmFL3,I1N@}EI^ 4o9>,L{~:p){Iy~:oN'ssaԁ߂/I/ߍSą|KgXFVn6U\!6?pfl6?м&T9|1+^YU}$_Q="~ȒS]Y>iOW_t[*L-M5[^{5)Jdmz8W-V^ίsW4 hzE X֋Bvk m>{O +;WU =7|C~0uqJ']!EڟWZ7T}һտRWZĔFs[W:.&sVY4 {ےI|dqP{o{ bǢ7TG4е.j\iY-ӹOWW6ClȐ3bsW5/z̵_Y3[G;~rw=G¶fGf9w]RK/̷bYiٓYa.T ڭo wkMOS{F TW^9P~PHNJ]8lŷ+Ӥdː[v>eYw+R3O/dt< SmbNQ,oP'O3ij]kfVJ]_ 9u3xo'^W9(`l}z"Q'ѕx$~E,An(ޣu>]~K·7+.-j:&'͚WvۮXϵ0/7YxMrSQFVPC#_[E˺FS-3uˢumy⒭|Qgɖ6=~Dl\QN{xuĿ-b~kOk n}oM|Kf\qQhʵ~`e}G;krFeJ]d*^ I By!kyw8SzF p™_ӛ P}_J|v0][աOo]%7edD{KtfmwYU|wuZ^Bxpo틾~mx4'Up9 9Zkwz;CQh?yg%m@Ϻ&|~-Gߓ.Xmkˢ-I_:b;*JLվkyM΢4Yοa3f?];Qdf+:;InB`yzzfkxKnR>w^U?KWu7"څ1l`{Hv2 cooK+,^mjO/L)\Qr^OF:ʾB`2`z2WzV"KUUvYn;/}~3i!GJ*L 3t^_:a`갟铏?Ěć./5&"[0GI4O'ԗtW g S2J^ %Y؇ ] A׮n;}Tp- /tv~ Cpކ &l'8G _qVpp:m\ڣ> HOܿE~R`z/G.#}>C$8t) M ب!>N }vϳNao՟",FSgun]OX# E*..~⭻SxAH} xp-\t_GQ TwGwe~ CF?B0 tGBoRG)#~7GV^8zCZDЯS?E,87E['=aU{ "菪/ /nA#՗ G@;@`'܎@vEuC ]OPu?GQE^Us4coA2Fx dv vv HaSݎvkW8{C A@2[/~"ݴ&W \ @ܬsжD#  _mtv̨O}#a?ٸG xX=mנ_"+˿>ndQ: /,#O v#}F={_A,WoD@?nH P^s5E: >ôBnO^&X $C_}zXN}xh5l@=60>KuuAw ? a䱡W؏@|&Fn9 ;]zJsp^&o~ lP#.Jo ARz9Aw ^|nג>m\t>m߇ @Yr{YwQCrIKo]8 j m /^5s'/KuK.剔L)aZo5MGLo槖Lݕzoꃩ&GL,iciݚvWi%ln3G̟]2e dLdʘx,㉌32;3'3f'uYY˲z l}hko~2,YBb92krE˫9M9rr.ι*ٜs^5V6={sgs?='M=?}ߗ?]oWPZPUpnd[Ap_; -|𵢊"[(Ptq5E7U@#RqFq~X_(K%C%;K(yݒKJK/+=XzVW8+xe+N eue}e]Uvɕ=++}呕W}%_PrQ<||WT+2*+V\qJR<#+߭2\Uު:Zj۫WZuWyUzs%߬~DMDͮ{jV5/fڗj_eueuuM.{źKr7߭.^]ioVk dXwYX?a]C m8zû lmClڎl,lTmn 6^xƣ'MMUM@M5~ӉfԜ|-Be-7rVcu_u/kh+nsmo~מ^~Y5϶ZM::u|㾎:eC*uO 7TPB<!'EW""e,A4Ay(弜*E/biBsx9=;C rPs5/;avQ /geIe0w/SlQ(-/ :^^N x,7r?y9Gx-,2/K 2{V6Tk,K-eg{gf6N)-MM ժluz.e-(,^ltx#36pfM/L-Ǫ'SCSʺVuEB^sƑYOHʸ:t+PL}!"sJx֭>pݴ*4ۚmsg=:[Hxʄ )-&[ӅNo`٬t)6ih'BZ5!ºNe ևm r<3>6M=IĊI3LGab3]QgT8\P&"e4Q[7W{}3hvFpo: qi> 6ksb7BMOPsf*W{ e|pt }qPd 2ZI4{ds:'A{=S߽UqdNjh* CNj6ɲ'v?P{q{"Jҡ'gePw ف-netkڶJ-X ~ohVz]{=.rs|8ʔ a<ע@п=%!"l\Ǧn'z==M 8.J S0\ {!&5F<@RAke?R140BʜLĭfhB$9S L@6,` (Mi##PaVE\,]iIg2^0/آI.}{]hP9r{!H4, 1SI/"➛t\XZ .cJ4^:t ;7b"݈bLi!v~* [!dMgd~ j:cF}QtI OO$ؿXd@ C[b*BB!r1n1 KIm̍ӸF=qaԬyoЃR`?bJ  !(JŨ;8 Q0q@ /"q۪!ͧO OIsS|t Vj MnxX M`wKJBiA#0i cd@\JdNq=̃-4\o + ZitX`ZP!r{A(-usYjiEQ@,rB0NXO;bz#n2ͱO>aꦄZv9\Y(ML  #S`s0Sx^W~8 1 Ly><ƽhk _"Sѝ$?-f‹pVМÐ  [ɔ?< V؋-@50eȉv58G A1D`KpH4F̶:|mN2\IvX0( aiMs744ay1ۡSs I3n%]%[L23abqoo;ɺ\sq"dA$ R'¤8KKT|rK^FG7Uݤ<&e@u4؀c*78;=8l'l=6>?{̮ +c#}JE8\WX#&h18Jeˠ*wJk|\SG}Ve;oбI~\ N#ԕ5h~2;=CX v+cۆǔmc#pvAGb;&dwdMV4Veb>=Ŋc 50bnG t )pW A;` +I`O*}ݛq@s;l;cCVe|;`wxC)[A ;M8w Q q*;V{lpPF]!@o_ -UheF`{G4z@gzfY!,(B0%IhhV [S nW?$`EX'I7g6mP$ t2cL>89 sz#f8B\BKZl$\Gpt xz~(L3]X K-w }4"ePHvqvz"5۩WA*m!/ƈ|C<~?^mML3ˮ5 I[,ƭ~l$ay*MIIB'Q EA.7nK1rP=$iRr;L,c#,\r/Hڇbm 羋E]%Q2ԡVLEir8݄"MաD;ө0;"(8!’ wP~C'iJ{tG$9;Fb;ȵdC 5zc8sDl< v ~ltͦ,u{\g{D̒հa1AfXF{M{һIn{驓pR9 I8*@Vf#16@L? -?rG; iNAv~ A}1Zqrm!?H!1bLdڂҜJ<$#`i0isg۹Hd=u1@p8ȴO1$L8)3kQv9?6EX;cL{:!.3L94! #{M5!}4䎵7LXH}_r%\ a]Aꋶ,'x k M %H`oLęa-\"Pj栥'&d>h60N5V!^t!rC[0N Y9g(b$XtMҬϒ'yb7d\OX#ϲ%zz_hIK_熓 -ȵK ei$dt{I"^ 0aTݤKFcbeHD/"$iOxk8X>k~.27~I%!5C Rxv`ޢQ?DYZYa76l}qrFRY&ZL~)S4B3滦S|N-ӟxB߭i'wI>WSV<܂DHr<1T 0fSAӥD+EL-ԉ'>BGq>[{\%m-`1m_P}OYF4:ľ3ӣs4ܜIV.nI*JYJsgBa6f}(ON,4a|Z" -tbZ`Q8E%Xk-\?M34˄^A!cMķYL\hqczs0,l I٢Gş 5&2:l]操U}!lddX[)F 9ʌOKxYL[[oxFp'"4N'SQ<3]:{j3Eb|-]y e ^r6@y/q²Vp\Żw; KW2k4~@1re"}il#1;Uf'yCGgl.5Q?'i 1P/f)g <+w%-N 5͌ 9p8&)1Xn9.)<.M6Fb'KOs&ϓegrﲹUvZ🁥3vk}NO˱|:qu" /0qEԩ#`r[̓)[bŲ+6e p:L4D㱶2@l?!NUX5fqU#-vl,O^*I:j{r,'=Bw 稍;hcwq]0GgOVs 4$ _KO`R4I{8Zӛ$mivİZ.svO :GZ׉SEYfDZ .Eb&)Q Ov=>ة%Ⱦ,g{-]E}24W[|ڳ:815#3hRO Z!/uھ ڮz!zG*z >6Nh7FBϛF ^v߯ Ahbco=AP&NLkFB3;;SR(r|s@/00X Ҍ 3h`waA1&qqzjQhǞ8v [-vg9z)9b5AXV8ep)c9>|<2x($!u`$x?į_v⫍(yYfDT؉C<?HC1žcT?WLx&V5t'SSƼ caoL#KK,NI 2iflҷq-a_Zvg!Xr)p<ƍӏ<0GFh3:}1c8 Wpe8 56V3R*hDcB} @@=lR\>B`~k#sԸ jOpF6^Z뤺f=p^x"ai6Pj洟 T6n̬@Ef&&~N wY2̼A3µP'ߥk=RR%`zn&H^ Ԫʉ-};Pk75pZ7u}ԧ~ہNjHRԺ~ok F Qkg1j(I@MmlJ®[@~^^Zɓ+0В$\5P_ORe8j\>PtD>GJTF_f~i*kjހ}}KT> endobj 20 0 obj <> stream xeWn#7+t& `M,# Y>\&sHU^-lnc|<o?|[O~z*oj>}y]m\~{]?<~=u𴬟>.t[wa~Y{7Eax@˼eWW~:]ަOw]y~.})>,X,DXw!XU,2یMel *cW}/vƪ3Xx"T혶3 3d,N52V1 :)3vͿMOq5)>*/1̟hy P37B'P[}G*b5+B$`AOLJԊpT4ȩXrN''[ E u SgCZz78r C"_cEFAb,8i$]j;!WC!ǯzȨ{2fˉjy(:)R)jDU_*TK^K͖ћZ'-[]j?M9ք <זN{ڧNHx" o:e(CFU#kiiZv6 6LX*̴0Te&mI̴aÖJ[R[vkȎ}ImiZʃ bYvbst]ItSDN;GSY9n@lhYu <PO1x9|ˁ1yS=y<<@ECy 9W?͑nhԴo{%Ggy#?R/lR/ T} 1rPd+*P?v{ lJ8؂0tM9ɉ I ;$ RGJqё>K)X?}JLk$5Q}VL=89&j5xsR(I6d>5DOM> endobj 22 0 obj <> stream xݼ xչ7>gf4FcY.'xx8+Id[ؖdgc%@@ -e)RH)[)V (B{RJ^r½=̙3}LEfbt(B٘`R%z ~['v5UƃюoUST'p?SQT]㓱p(NGEMvNE50 dp U5=ƨ_PԞt$8}!n J ~-t9|rjh2s.waqIiYEeUM˚Z;VtuXf݆6m>>;ٱsמs; /CG~}w{C?>?gUah F*VTKUV8~]ڍnx2*)E=qQ05VڕzqJk~qrJ{Am4b e ͢;`q) {mjDrטcjN޼k:(Hv݀87lЮjTs\^*6kA֣c1o9JAa)'\ͰcN Aɱ\kc22䧟)xesh-{]#3g5[d(3xEn] bo#%4UTV pc<HK7O*)m7o&BQm1= PpJtQp,Yc =K7 u 1}q-}VOG%ܖ^mTmY*jvQ/~= (fTkk};vW[tj mW_rÆ\o;F}o19&\- yκ8mUVqu;}|ŏU-Xng~İ>Po"̀SKd-_Kfvqc@;3CW5?|DCٻ3vY:gRXZyv~NF#}ٴ6o8΍: ^|3 ]my뉼 ,Ȉ3֌$CEfM6*K[ oKֆ }N0d7T +I1* beȇ8G?Ə7Mu U<ün^14fgT*F#kE~|1 e wrkdJ.iVeWXW.uv2*:{JAc]&a%¼Kq:x; ^KNW=nh-48V^O?S+3萉6׋_NXMkF]ZMiwU()2DF6-3VB| l Pd3}СLEJk]n6쒪:CCVWeov-28tbkm%O^ /kïtER  @qݻWVUih XCI^qzЗL?J XRI+S}lciHiX]DMFK!%}bO|=AR Q0v[BCuV.׎5J]ކ]<-PVYscm[Fތ- ]P1vlR>?ۉh _LpJt!`,*0џ~1[x|ݑCs,C`usz5]uVś~,gT(ĊgUY]OPQg<6дOe{p yЃZ(ϻ3;,'ѿWѷ 6`c8/`ӳK٦%m^ؐ_wWf Tݠqהּh_{-gɑmaW)v>V[aA;Jsg5q|CAztfrMC '9r|qvl]$CTpfRiՉc \~7Ñ :o>2|&Kut4Oo,QlŞÒ弍?&*Y߱t2]]բ;lpl^bx]+2nv&Win=qjjՇV݉ASpƧlM^9:8i9x=1΢v+at)"p1^@KKSwo[ZȌsY>8a}GH=0!~[b~^62U-1m ;W.-j5v8=[-aozjzѐN&z _H<:>k**(3 rJ$>Dʱ{ݠ ѲKohm,YmKoTe݈J2#fFY监2L[?`ؕ|ֶ]CN8'ҭnG,#,S0-p h9mګ[W\LX&~2Ѵ}XsLziUO{zJpUhUjwV06+kۻLBM7[13羾}}~Xstx1TzV+֎TG_yA}Uߝvȴu%=r1}ɜ;'rxD1'O\ ?Rxzc/;Z,Q>] d6 42@߃A,z~QrnP Jf֥5]ݵ7-JyJ{p΢,֎<@ۧp&Ԓ2\vJXDµjǥl<8M9Jd=:kSsFNף0 OH c <$?_a P}E6,^ ?=nSd6nk$1"(=Aǩ I " b.@6`Ui;b&z7 vztM͉T-820Rg0-%wbEOv = `Gt?Vt hsgݳM]Y RG*#$ǒm >YaH!Z(c%.&!@w]+fV kfyj1P{5lu84Hx0[m.=sᄋcbP*iڍ.Wsnؑ[ijhK}H)\Ռ7m^X_2/Sρkat#I"_LNkA^܊P-5e( ?2.GO#'2zS).j@׸nr(\v;m,z1 1"~zi!CS-
Z`dN2N'G\R]Gۊ +.RȅHZa6mͲFlnؿ_޿3٘ t2IŠ^J&-+jGgz1g4)}w4`ǒN{Q+w[HӦ4p}iRqmEuoW(A8d~]zW|ֈRRU&s@%WuwiyW[⭶lsMyeYhdѫv/~.P|_qk/|䱙Î5vUKCE4-_qfsǿRH 4 ɵ_xǿsq -k'x7k=DJ"?sM!rg=ZҪ&|" ]Ҹ\K0|{ɹE9c_^~SWU^soW(@ەI&g)UDIX bdwUS:4tEK4:K,/7WDͣ>eUٵc Me̝Ρ-bx-2&y_WSx3q!eU͵ҩ q2v UmԹBNg6m4eU0\&cT!6:qp1Kqi5sHȜɼ2(k#ԅh>ӄ\U>9!څ]{[+.U)e 7dᙟl%<|Jd1s۶ 9r7de@~C6}b,* 59"JO3* >ʨƨ;X-,omwg쎕,堂\5Tu{8#7Päq?WLۺKϪBnHcsЧ1,ՋOAhKJ֥kx[Э;WExpFt (hx.`&2h/d8%qtu.ߵkuǪzt39t6*=z:*kW|C˦F{k5gmls5h◘Z)*|L٢VGбCTJlss=/ײ7JM5t#*|zU =<`I"ޠ~ŕ352eVy }h樊N;K7 {t_?͢-W;?Q53M }D7F,ğd R9IpN!Kn+ Z7=J %"P yVO~9;~yy([}+sOȰƜq]~}y/c Yb+WPv{=-a?v;+YMhB7Ztm,O2Ze>qZ(TNpK'uY2CJCZ+m73&K 7%VO۫ʳ#ױ,h6YdKˎ=۲ܶIWZt~Lw2R<JعkY_l}<4~@˕x*ARBH.D2?Eru\U?hU 57/)͌f6K'K4rowoB3\XT1]TrWO=9r---[_~~?5K|㯕LFHļKEWJϸѦ3ՋؠՕ|qVOOf4ZM✋ddu'9mLGMGH[w62rJB4a% sɠ6ף+6;cbNCe}*˕l(G{J'OtH #(gX)YӔrq>*] EA yu\ϝcvgH,9CJZNԃRޠ(. kF"v" N鮩97r|k֞U A" qKVֻ|2!q 5"q"6GǙ1I}̑E 2H,W='ʊ{l~憟>dnmTYkQ<>&~+DqH5>.{H:wY HѻFްt%97> #z%uu܃.;R^,M|kѠ NoG^9KG8wKy7 #~;KrHO.ʾկ JEx@B,4K[Uh3 YVѫ MsH5dՄS>:qqc s2ΔD r5`g7ć}Ŋ]Ey=Mdm-;sK?軯{ifwGlmHwm=ͭh fpy%%_0ŠOsO+~et.2N8b&.ɐp6yU' q*.3KLnKU|Kܰ-q,~΋.CF=RkP?hl݆Uh6N^ѳWki҆W8vڳ~1}3o*{.ƱRi03Jw|Jxyb.?\z{jnI"RX`\P f- 3,G(aߏdm0~1)]س|Mު%fz5(-f(uEZՏޫͪn59ҙ%} ,[[gBY貹oFUxW?qxFY+ξ{( 8$8k|vp MMQ٬ ]UX%t2a1/Av;XX9k)+>Tăэ1tF{"v} Rk'Tme#Wҩ)@^8r=/魨c[.0شe*luwg H{KP*Fd~ƌ\)ܪ/2\^4+0g{zp^#۝d΋=p"}A^ Tas3\iV1Ԭ>wk֖>ٻ6hMjmwv2oXP1yeB5PL;xȌ..(/{IcTP^}0_+- o!LU!l^!-,#KSM)꽡հ!*qOAxp>}KӕJ!RJ+v(7c,NTY39ݖAE)/6fmL/Bs;zޖA3whW!5'ߣ}{JX=ؾ=B3Yp1ڇ5rC& 5V s%q+EC&6*qE822k"{=B]?Rr,0kVx9. ;l*ƊQjwusSթP_Hlwal@Ż`+u0~\*S?c#NW/.b(hFyE2nhe{~E}tlj-I_ %*1Z-}KwSJ"o=Gggz@%);W.Z,vRFIʷWe3t=]p+V:ʷvͭ~}v`u}vޜcELVTVVo^BST㯫?E۱H62_̕wSH3N$yUځ\+ k4*2.-ڂf^լ̈́,ϭ^faɾT k=&zDc)F<Ӎ kd枛{6ɼKM&ݲIP. DO9׽+.'_Vl>jLk=T >o@c#w|N |. /C~n(窬l}Vf7kNJevaԉ7}^BQ轛؍|ɱLI#K;6"H ^<#=(&y&'}lR1Uinft0tפ겯d-7Cq=4ǜ j,ڹI! 3}YH0仨rɅğn(/3 [sj˺.ΔeOY\{88cSB6w,2Xg:Wz*WO/R8S!+TAHkH%^ÛdOZWoKņRۈ5M\Ԉ.jtd~ӼŒޛMoBg}ƴB{唏i*1_~J޹E5#Nʉy5J= 7y{X[Qe5/_d5\ A4*F'1O0Bzuٝ`xMbMn@W"thou-G~LhuW *j=$ dx{̐.-,*x9} *^ymQ J}J欆G{T Ζߩ[YR /_sh|DF.{v'\I݊J>uzZ2'mrNUxb޷\o+m6\\3wE$g+r9}F֓}Y"u% ߅\0|Pd:a-H_ϟ4gSzͧlZ9(8‘z%,?pvYZc =V\7ѝᛕTS7T-ۿ0d$7QB|KP]ӟ)_/w:~O(|ؓ_=ҡq.ӘM_Ȃ~+S^ aII^߈Ǚ'LFbWZDr&w~=yomirZ7gG-'+i_\zj6SРR3]`xkQg_?0Xyi2.R0^ rx2W`'-Og,F~L~r \UPdA˕vqC<^uV6"hslzU,&|ۍ0ǘAvkrRB[f :ܲUTabewٱŦsQcY$3rU3rp++EUZɤ_6A`}ҿtg7?/S?ߟg4skN|"R%m <)Q je!+ (üA A2vƟ ܌ߌˣ?ON 7tQ hiJ3u7jz6{<Z/K׸Lv+?>c@?qqc 5*7 ѕщgN5nj?nu n[ܨckHP Иwqc/3wsqc^Í6ŏ6Ƈ>;.Dڶ=a~iT-KղP7Q(JleP夎Qn0ڸ,gGRa^ao\ṵOpG}a]. 7)gځ@ / "_ "'J8xn?K]2\w@Ut _č:q_č:qC7F[B041̣p@Qڟz͉Mw 1h#bsԇ(9E5X} }%2gsCKg,͖N{}D*i9{)R|85s=yskJJUV+*oQ>LE*Ym]TWwתR߯~WV^71vmCMf1o5hW;ݢޮ]]XB7];{MC}~~HLi6 y 6|hH}z6c&cw.Z֘:뷭Y߲zf]`;h{kzNE+ٟr~ǝ{xYO[61ҞLgӍu}ү$^T~h4wМH~Q 4^ UA)YJr_AIs}5ExDur_CMA:}=a+-rXHAM>x[ܧ)W3԰,œ}%؞a{O4;#yZoϔזHhxL()*+KWWX9 .~;3[}Bᩨ0r:^a 8B)ae8:2.GљD00FPThOńXlG ``"4`D4K(`*|P$:3 ቨP+oLL*:̅+@br_E_U*/q@F&hh$0!4Eá!k:8"@t c bp8@\DLMXpg't`4uJ& &1Š``&n] ظDv ûfl/F@( hX>1%i!!w s=Ŧv ],ԔwA2U #-&?E"/ =fO`6 wi2ёHh:ECiYo{?<# ]-m=mR/#3uyֆ|_[SwsW%(l  m;B!X$` ߡIЬ0' Y$(^e$< GЬEӑH /13= &;c#`{>86Fl F`bX2`+3!z B$5XV H0G0b, 0c&`"A!:&Dd?i:MC<bQO5( h`fFC3 x(gb) 8 "̞ DŽhxb3 NFO< `G&` XX tL4 pR&0pptNe$ -pǾ!pOFB@ܞ?/#A&w&vX;dK̈Ϟ EDMJ τH0ƛ'v000<2CV! '&&I%Ԣsgw.WN0e `c ?I$`!/C0R-:v O"۱`T#!ݼax&lEe%IB&%+o* KȣY9B&Z0&] M ]?X4D=CQ>U{O某޳;a}$W A!} ͐^ZpX/ C̀ac2AI2 xÑV(d@4n2 SBpj1&i&6J"N.6A qc);"!,E^2iX%LHRŵl90 ޞV(P3OX7S1싈q֠7Z:<#.|&8`o xdAd7˻I1\/ v$B4u[~~[  ȀE +`H`r*IhL(sxАyA ÍNVj0DPCT'Oj߉ޓF0 *”"'z1x8);I,F In|f20U |$sKm"$4d1L8X` z1)B(!?7%I|AGg ^>z61@[# *P)B9L1rg江;{9-/d$x>d/*җ]NY rb58I4R&G"LɰejO+H~-e;ęX=,DJ 'ăS ( Sw9Fp5(sIv0o)·$^:"=,~^<7';杓t!OD 'RMIԔBr! 9X] gʽ{ gȽ(3LO- xL (&i6~,5 'N;ܕhq*9vI@o6s@lmkMp k:;zW 0gpBS:aegOo[ /tvuuzΞխ=˅fxW|ݝ`/yT^ kKK\65wvu 흃=xvXIklY/±i]ںzy@۷syǠA0Կҋ6Ԇ9%]> }T@OZ ̯I,oio }m-ok$v]!mV-@md `=@!^g0 eM@Wh|{/"'W zdX,xTYi^" 0N;0GPajEEb@R#T]ISJ^ѕ0+@MPAj:(5+T==xN#\o=#W1; 3Q ðW<12Iܞ:A? w92.KjtO&Ƨi27FbW_iF<YbJqBMod#E"cR*珓qJ58IGiK8EjTN |ɵJxn6%5X)Ib_?%AYrS2./i' );JSRUcr$tϿ$>YgLN3:?iM) fûE)KCu:s.-ŻSΟ(Z=&OK#2&0@%+tkTS:/$"l#5j5{ 6rهx-H;|[X-2$\XVcT{~} =Ubo|OVwV 9F8-Es3G1dHtJrхd )˴LG49)qHdytƬ&\ML텲z*WX~3ę=̟N9d7Jy]FSOŸaUu{Cm.S?i㫵+T>3# IWYZfHBu)q UD uLQV|ƱzNZx/%o9^VQ܋?W2Z47QwuR@>#{fnǨ3U':'ΉsW>)'NpBuN;[cZ=@7_${0khRud-i~^GIorV.hȪ>ήՄj9ߣKSw|tw](!e &X{ p']FDxW$oWNw̓86%=v/FyW--:2c9$(I3BLO+yﺒJze)*>aww=ҳipD]d~"6M;TH?l"tobTՁ m]Hԕ!d?L+I%wE>hVm47 㟧Bs%52lIJҩ\YC,j"MꕹBi7l!֒u9V~rV!WBVLFV@f.;iy?Y ϭs>n9yN#00VK*`_ X.E)_pZBSR@έ'_@U/5u E2 W }:. JnN*#̫4(\ #e»5nک|@\ApuyYyO~9_Զqwavn0> endobj 25 0 obj <> stream x]UɎ0+r9]B"a 34(l7UгS{UvyU8,;% c?}\~voØICUﮧ)[y㾸aܶl/#Ͻ-]>MՍK..zn^<,WBUXH>:77m۶en?}BDsªf籊E =b0&lE\8k7^#qq_\u_#nb6e_#ő٘[|r IP,}EeMdgn]:TXR,t K%AE ujb@!ް\Q%jj% )(@q@S|0R?0f;GPy_CCÒjE4D-ik#@zOuIékƺE9 FW4KwTw&Nf)."=:o)J:OV%~gĦs\fnPeI *MMBvI-6 DQCc6* H!Ȼy@xrǙ?*M ҴK endstream endobj 26 0 obj <> endobj 27 0 obj <> endobj 28 0 obj <> /ExtGState<> /ProcSet[/PDF/Text/ImageC/ImageI/ImageB] >> endobj 1 0 obj <>/Contents 2 0 R>> endobj 6 0 obj <>/Contents 7 0 R>> endobj 11 0 obj <>/Contents 12 0 R>> endobj 16 0 obj <> endobj 29 0 obj <> endobj 30 0 obj < /Producer /CreationDate(D:20131107230107+02'00')>> endobj xref 0 31 0000000000 65535 f 0000067608 00000 n 0000000019 00000 n 0000005785 00000 n 0000005806 00000 n 0000005983 00000 n 0000067752 00000 n 0000006023 00000 n 0000011388 00000 n 0000011409 00000 n 0000011586 00000 n 0000067896 00000 n 0000011627 00000 n 0000016121 00000 n 0000016143 00000 n 0000016321 00000 n 0000068042 00000 n 0000016362 00000 n 0000045740 00000 n 0000045763 00000 n 0000045962 00000 n 0000047141 00000 n 0000048305 00000 n 0000065858 00000 n 0000065881 00000 n 0000066080 00000 n 0000066790 00000 n 0000067392 00000 n 0000067435 00000 n 0000068155 00000 n 0000068253 00000 n trailer < <0EC24F05E6BD3F2819DE2C22DF5EDDC1> ] /DocChecksum /20C17C7440DED784BA5D3387BCBA4933 >> startxref 68428 %%EOF