From 9aead5720e7c06affa08beb375f4e01e5eef249c Mon Sep 17 00:00:00 2001 From: Matt Gibbs Date: Thu, 26 Oct 2017 12:23:48 -0700 Subject: [PATCH 01/23] Improve/document caget_multi method, add ability for caget to accept lists and pass to caget_multi. --- doc/overview.rst | 31 +++++++++++++++++++++++++++++-- epics/__init__.py | 18 +++++++++++++++--- 2 files changed, 44 insertions(+), 5 deletions(-) diff --git a/doc/overview.rst b/doc/overview.rst index 4342a85..0df1a82 100644 --- a/doc/overview.rst +++ b/doc/overview.rst @@ -179,9 +179,9 @@ quite good. .. function:: caget(pvname[, as_string=False[, count=None[, as_numpy=True[, timeout=None[, use_monitor=False]]]]]) - retrieves and returns the value of the named PV. + retrieves and returns the value of the named PV(s). - :param pvname: name of Epics Process Variable + :param pvname: name of Epics Process Variable or list of names. :param as_string: whether to return string representation of the PV value. :type as_string: ``True``/``False`` :param count: number of elements to return for array data. @@ -193,6 +193,9 @@ quite good. :param use_monitor: whether to rely on monitor callbacks or explicitly get value now. :type use_monitor: ``True``/``False`` +If *pvname* is a list of strings, :func:`caget_many` will be called +instead with the same arguments. + The *count* and *as_numpy* options apply only to array or waveform data. The default behavior is to return the full data array and convert to a numpy array if available. The *count* option can be used to explicitly @@ -272,6 +275,30 @@ Of course,character waveforms are not always used for long strings, but can also hold byte array data, such as comes from some detectors and devices. +:func:`caget_many` +~~~~~~~~~~~~~~~~~~ + +.. function:: caget_many(pvlist[, as_string=False[, count=None[, as_numpy=True[, timeout=None]]]]) + + get a list of PVs as quickly as possible. Returns a list of values for + each PV in the list. Unlike :func:`caget`, this method does not use + automatic monitoring (see :ref:`pv-automonitor-label`), even for large + waveform PVs. + + :param pvlist: A list of process variable names. + :type pvlist: list of str + :param as_string: whether to return string representation of the PV values. + :type as_string: ``True``/``False`` + :param count: number of elements to return for array data. + :type count: integer or ``None`` + :param as_numpy: whether to return the Numerical Python representation for array data. + :type as_numpy: ``True``/``False`` + :param timeout: maximum time to wait (in seconds) for value before returning None. + :type timeout: float or ``None`` + +For detailed information about the arguments, see the documentation for +:func:`caget`. + :func:`caput` ~~~~~~~~~~~~~~~~ diff --git a/epics/__init__.py b/epics/__init__.py index c6fc313..5b268f1 100644 --- a/epics/__init__.py +++ b/epics/__init__.py @@ -77,7 +77,15 @@ def caget(pvname, as_string=False, count=None, as_numpy=True, to get a truncated amount of data from an array, you can specify the count with >>> x = caget('MyArray.VAL', count=1000) + + if pvname is a list of strings, caget_many is called instead. """ + if isinstance(pvname, list): + return caget_many(pvname, + as_string=as_string, + count=count, + as_numpy=as_numpy + timeout=timeout) start_time = time.time() thispv = get_pv(pvname, timeout=timeout, connect=True) if thispv.connected: @@ -151,7 +159,7 @@ def callback(pvname=None, value=None, char_value=None, **kwds): thispv.add_callback(callback, index=-999, with_ctrlvars=True) _PVmonitors_[pvname] = thispv -def caget_many(pvlist): +def caget_many(pvlist, as_string=False, count=None, as_numpy=True, timeout=5.0): """get values for a list of PVs This does not maintain PV objects, and works as fast as possible to fetch many values. @@ -161,8 +169,12 @@ def caget_many(pvlist): auto_cb=False, connect=False)) for chid in chids: ca.connect_channel(chid) - for chid in chids: ca.get(chid, wait=False) - for chid in chids: out.append(ca.get_complete(chid)) + for chid in chids: ca.get(chid, count=count, as_string=as_string, as_numpy=as_numpy, wait=False) + for chid in chids: out.append(ca.get_complete(chid, + count=count, + as_string=as_string, + as_numpy=as_numpy, + timeout=timeout)) return out From b6357822348f45d860e601b4676f347e0c36066f Mon Sep 17 00:00:00 2001 From: Matt Gibbs Date: Thu, 26 Oct 2017 12:30:37 -0700 Subject: [PATCH 02/23] Doc formatting tweak. --- doc/overview.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/overview.rst b/doc/overview.rst index 0df1a82..c84cc77 100644 --- a/doc/overview.rst +++ b/doc/overview.rst @@ -286,7 +286,7 @@ devices. waveform PVs. :param pvlist: A list of process variable names. - :type pvlist: list of str + :type pvlist: ``list`` of ``str`` :param as_string: whether to return string representation of the PV values. :type as_string: ``True``/``False`` :param count: number of elements to return for array data. From 963e3357c0493b16805492d0ef1495fa1861ba6d Mon Sep 17 00:00:00 2001 From: Matt Gibbs Date: Thu, 26 Oct 2017 12:33:37 -0700 Subject: [PATCH 03/23] Move caget_many documentation further down to indicate its relative unimportance. --- doc/overview.rst | 47 +++++++++++++++++++++++------------------------ 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/doc/overview.rst b/doc/overview.rst index c84cc77..2c00400 100644 --- a/doc/overview.rst +++ b/doc/overview.rst @@ -275,30 +275,6 @@ Of course,character waveforms are not always used for long strings, but can also hold byte array data, such as comes from some detectors and devices. -:func:`caget_many` -~~~~~~~~~~~~~~~~~~ - -.. function:: caget_many(pvlist[, as_string=False[, count=None[, as_numpy=True[, timeout=None]]]]) - - get a list of PVs as quickly as possible. Returns a list of values for - each PV in the list. Unlike :func:`caget`, this method does not use - automatic monitoring (see :ref:`pv-automonitor-label`), even for large - waveform PVs. - - :param pvlist: A list of process variable names. - :type pvlist: ``list`` of ``str`` - :param as_string: whether to return string representation of the PV values. - :type as_string: ``True``/``False`` - :param count: number of elements to return for array data. - :type count: integer or ``None`` - :param as_numpy: whether to return the Numerical Python representation for array data. - :type as_numpy: ``True``/``False`` - :param timeout: maximum time to wait (in seconds) for value before returning None. - :type timeout: float or ``None`` - -For detailed information about the arguments, see the documentation for -:func:`caget`. - :func:`caput` ~~~~~~~~~~~~~~~~ @@ -435,6 +411,29 @@ and the log file is inspected:: XXX:DMM1Ch2_calc.VAL 2010-03-24 11:56:47.536623 -183.5223 XXX:DMM1Ch2_calc.VAL 2010-03-24 11:56:48.536434 -183.6832 +:func:`caget_many` +~~~~~~~~~~~~~~~~~~ + +.. function:: caget_many(pvlist[, as_string=False[, count=None[, as_numpy=True[, timeout=None]]]]) + + get a list of PVs as quickly as possible. Returns a list of values for + each PV in the list. Unlike :func:`caget`, this method does not use + automatic monitoring (see :ref:`pv-automonitor-label`), even for large + waveform PVs. + + :param pvlist: A list of process variable names. + :type pvlist: ``list`` of ``str`` + :param as_string: whether to return string representation of the PV values. + :type as_string: ``True``/``False`` + :param count: number of elements to return for array data. + :type count: integer or ``None`` + :param as_numpy: whether to return the Numerical Python representation for array data. + :type as_numpy: ``True``/``False`` + :param timeout: maximum time to wait (in seconds) for value before returning None. + :type timeout: float or ``None`` + +For detailed information about the arguments, see the documentation for +:func:`caget`. Motivation: Why another Python-Epics Interface? ================================================ From 2c367d0c2f207c418f5b2d2dd34dfae4f4dda91c Mon Sep 17 00:00:00 2001 From: Matt Gibbs Date: Thu, 26 Oct 2017 12:57:38 -0700 Subject: [PATCH 04/23] Add missing comma. --- epics/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/epics/__init__.py b/epics/__init__.py index 5b268f1..980fcb4 100644 --- a/epics/__init__.py +++ b/epics/__init__.py @@ -84,7 +84,7 @@ def caget(pvname, as_string=False, count=None, as_numpy=True, return caget_many(pvname, as_string=as_string, count=count, - as_numpy=as_numpy + as_numpy=as_numpy, timeout=timeout) start_time = time.time() thispv = get_pv(pvname, timeout=timeout, connect=True) From 98d3528593e8d69cab3afa484ba3b49b71f7ada1 Mon Sep 17 00:00:00 2001 From: Matt Gibbs Date: Thu, 26 Oct 2017 13:06:32 -0700 Subject: [PATCH 05/23] Accept tuples of PV names in caget_many as well. --- doc/overview.rst | 2 +- epics/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/overview.rst b/doc/overview.rst index 2c00400..77711eb 100644 --- a/doc/overview.rst +++ b/doc/overview.rst @@ -422,7 +422,7 @@ and the log file is inspected:: waveform PVs. :param pvlist: A list of process variable names. - :type pvlist: ``list`` of ``str`` + :type pvlist: ``list`` or ``tuple`` of ``str`` :param as_string: whether to return string representation of the PV values. :type as_string: ``True``/``False`` :param count: number of elements to return for array data. diff --git a/epics/__init__.py b/epics/__init__.py index 980fcb4..f944557 100644 --- a/epics/__init__.py +++ b/epics/__init__.py @@ -80,7 +80,7 @@ def caget(pvname, as_string=False, count=None, as_numpy=True, if pvname is a list of strings, caget_many is called instead. """ - if isinstance(pvname, list): + if isinstance(pvname, (list, tuple)): return caget_many(pvname, as_string=as_string, count=count, From f2b839656a9db553881648c268b9e35101561867 Mon Sep 17 00:00:00 2001 From: Matt Gibbs Date: Thu, 26 Oct 2017 13:06:45 -0700 Subject: [PATCH 06/23] Add a basic unit test for caget_many. --- tests/pv_unittest.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) mode change 100644 => 100755 tests/pv_unittest.py diff --git a/tests/pv_unittest.py b/tests/pv_unittest.py old mode 100644 new mode 100755 index 5939c19..fd8e8a5 --- a/tests/pv_unittest.py +++ b/tests/pv_unittest.py @@ -7,7 +7,7 @@ import unittest import numpy from contextlib import contextmanager -from epics import PV, caput, caget, ca +from epics import PV, caput, caget, caget_many, ca import pvnames @@ -63,6 +63,15 @@ def test_caget(self): sval = caget(pvnames.str_pv) self.assertEqual(sval, 'ao') + def test_caget_many(self): + write('Simple Test of caget_multi() function\n') + pvs = [pvnames.double_pv, pvnames.enum_pv, pvnames.str_pv] + vals = caget_many(pvs) + self.assertEqual(len(vals), len(pvs)) + self.assertIsInstance(vals[0], float) + self.assertIsInstance(vals[1], int) + self.assertIsInstance(vals[2], str) + def test_get1(self): write('Simple Test: test value and char_value on an integer\n') with no_simulator_updates(): From 3cb240129bb9f5b74aaf07a972a94d469454cad7 Mon Sep 17 00:00:00 2001 From: Matt Gibbs Date: Thu, 26 Oct 2017 14:04:37 -0700 Subject: [PATCH 07/23] Fix minor doc typo ('of' -> 'or'). --- epics/ca.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) mode change 100644 => 100755 epics/ca.py diff --git a/epics/ca.py b/epics/ca.py old mode 100644 new mode 100755 index 8448aec..7a1feba --- a/epics/ca.py +++ b/epics/ca.py @@ -1352,7 +1352,7 @@ def put(chid, value, wait=False, timeout=30, callback=None, before returning. timeout : float maximum time to wait for processing to complete before returning anyway. - callback : ``None`` of callable + callback : ``None`` or callable user-supplied function to run when processing has completed. callback_data : object extra data to pass on to a user-supplied callback function. From eb7e319329a7d004e35ff0025b88aab8441973bc Mon Sep 17 00:00:00 2001 From: Matt Gibbs Date: Thu, 26 Oct 2017 16:22:53 -0700 Subject: [PATCH 08/23] Add a caput_many function, with documentation and a unit test. --- doc/overview.rst | 27 +++++++++++++++++++++++++++ epics/__init__.py | 20 +++++++++++++++++++- tests/pv_unittest.py | 14 ++++++++++++-- 3 files changed, 58 insertions(+), 3 deletions(-) diff --git a/doc/overview.rst b/doc/overview.rst index 77711eb..b400e72 100644 --- a/doc/overview.rst +++ b/doc/overview.rst @@ -435,6 +435,33 @@ and the log file is inspected:: For detailed information about the arguments, see the documentation for :func:`caget`. +:func:`caput_many` +~~~~~~~~~~~~~~~~~~ + +.. function:: caput_many(pvlist, values[, wait=False[, connection_timeout=None[, put_timeout=60]]]) + + put values to a list of PVs as quickly as possible. Returns a list of ints + for each PV in the list: 1 if the put was successful, -1 if it timed out. + Unlike :func:`caput`, this method does not use automatic monitoring (see + :ref:`pv-automonitor-label`), even for large waveform PVs. + + :param pvlist: A list of process variable names. + :type pvlist: ``list`` or ``tuple`` of ``str`` + :param values: values to put to each PV. + :type values: ``list`` or ``tuple`` + :param wait: whether or not to wait for processing to complete (or time-out) for each put before returning. + :type wait: ``True``/``False`` + :param connection_timeout: maximum time to wait (in seconds) for a connection to be established to each PV. + :type connection_timeout: float or ``None`` + :param put_timeout: maximum time to wait (in seconds) for processing to complete for each PV. + :type put_timeout: float or ``None`` + +Because connections to channels normally connect very quickly (less than a +second), but processing a put may take a significant amount of time (due to +a physical device moving, or due to complex calculations or data processing +sequences), a separate timeout duration can be specified for connections and +processing puts. + Motivation: Why another Python-Epics Interface? ================================================ diff --git a/epics/__init__.py b/epics/__init__.py index f944557..259965e 100644 --- a/epics/__init__.py +++ b/epics/__init__.py @@ -177,5 +177,23 @@ def caget_many(pvlist, as_string=False, count=None, as_numpy=True, timeout=5.0): timeout=timeout)) return out - +def caput_many(pvlist, values, wait=False, connection_timeout=None, put_timeout=60): + """put values to a list of PVs + This does not maintain PV objects. If wait is true, + *each* put operation will block until it is complete. + Returns a list of integers for each PV, 1 if the put + was successful, or a negative number if the timeout + was exceeded. + """ + chids, out, conns = [], [], [] + for name in pvlist: chids.append(ca.create_channel(name, + auto_cb=False, + connect=False)) + for chid in chids: conns.append(ca.connect_channel(chid, timeout=connection_timeout)) + for (i, chid) in enumerate(chids): + if conns[i]: + out.append(ca.put(chid, values[i], wait=wait, timeout=put_timeout)) + else: + out.append(-1) + return out diff --git a/tests/pv_unittest.py b/tests/pv_unittest.py index fd8e8a5..8607fa3 100755 --- a/tests/pv_unittest.py +++ b/tests/pv_unittest.py @@ -7,7 +7,7 @@ import unittest import numpy from contextlib import contextmanager -from epics import PV, caput, caget, caget_many, ca +from epics import PV, caput, caget, caget_many, caput_many, ca import pvnames @@ -64,7 +64,7 @@ def test_caget(self): self.assertEqual(sval, 'ao') def test_caget_many(self): - write('Simple Test of caget_multi() function\n') + write('Simple Test of caget_many() function\n') pvs = [pvnames.double_pv, pvnames.enum_pv, pvnames.str_pv] vals = caget_many(pvs) self.assertEqual(len(vals), len(pvs)) @@ -72,6 +72,16 @@ def test_caget_many(self): self.assertIsInstance(vals[1], int) self.assertIsInstance(vals[2], str) + def test_caput_many(self): + write('Simple Test of caput_many() function\n') + pvs = [pvnames.double_pv, pvnames.enum_pv, 'ceci nest pas une PV'] + vals = [0.5, 0, 23] + success = caput_many(pvs, vals, connection_timeout=0.5) + self.assertEqual(len(success), len(pvs)) + self.assertEqual(success[0], 1) + self.assertEqual(success[1], 1) + self.failUnless(success[2] < 0) + def test_get1(self): write('Simple Test: test value and char_value on an integer\n') with no_simulator_updates(): From 48b17f6cb495a261da5843e0026f9328703f78f4 Mon Sep 17 00:00:00 2001 From: Matt Gibbs Date: Tue, 31 Oct 2017 13:13:52 -0700 Subject: [PATCH 09/23] Implement waiting for each PV in a caput_many, or waiting for all PVs. --- epics/__init__.py | 65 ++++++++++++++++++++++++++++++++++++++++---- tests/pv_unittest.py | 34 +++++++++++++++++++++-- 2 files changed, 90 insertions(+), 9 deletions(-) diff --git a/epics/__init__.py b/epics/__init__.py index 259965e..38e7173 100644 --- a/epics/__init__.py +++ b/epics/__init__.py @@ -25,6 +25,7 @@ import time import sys +import threading from . import ca from . import dbr from . import pv @@ -179,21 +180,73 @@ def caget_many(pvlist, as_string=False, count=None, as_numpy=True, timeout=5.0): def caput_many(pvlist, values, wait=False, connection_timeout=None, put_timeout=60): """put values to a list of PVs - This does not maintain PV objects. If wait is true, + This does not maintain PV objects. If wait is 'each', *each* put operation will block until it is complete. + or until the put_timeout duration expires. + If wait is 'all', this method will block until *all* + put operations are complete, or until the put_timeout + duration expires. + Note that the behavior of 'wait' only applies to the + put timeout, not the connection timeout. Returns a list of integers for each PV, 1 if the put was successful, or a negative number if the timeout was exceeded. """ - chids, out, conns = [], [], [] + chids, conns = [], [] for name in pvlist: chids.append(ca.create_channel(name, auto_cb=False, connect=False)) - for chid in chids: conns.append(ca.connect_channel(chid, timeout=connection_timeout)) + for chid in chids: conns.append(ca.connect_channel(chid, + timeout=connection_timeout)) + #Number of put requests awaiting completion. Only used if wait=='all'. + #Reminder: acquire 'all_done' (defined further down) + #before using unfinished. + unfinished = len([conn for conn in conns if conn > 0]) + #mutex is used to coordinate access to 'unfinished'. + mutex = threading.Lock() + #Notify all_done if there are no remaining puts to complete. + #This function will block until all_done is notified, or + #the put_timeout expires. + all_done = threading.Condition(mutex) + t0 = time.time() + wait_for_each = (wait == "each") + wait_for_all = (wait == "all") + #'out' is a list of return statuses for each put request. 1 if success, -1 if fail. + #'out' is filled with fail to begin with. + out = [-1 for i in range(0,len(chids))] + #To get around the fact that you can't *assign* to variables while + #in put_complete_callback's scope, but you can modify them. + put_context = {"unfinished": unfinished, "all_done": all_done, "status": out} + def put_complete_callback(data=None, **kws): + #put_complete_callback is used in wait_all mode. + put_context["all_done"].acquire() + remaining = put_context["unfinished"] - 1 + put_context["status"][data] = 1 + if remaining <= 0: + #We're all done! + #Notify the main thread to stop waiting for puts to complete. + put_context["all_done"].notify_all() + put_context["unfinished"] = remaining + put_context["all_done"].release() for (i, chid) in enumerate(chids): if conns[i]: - out.append(ca.put(chid, values[i], wait=wait, timeout=put_timeout)) - else: - out.append(-1) + if wait_for_all: + ca.put(chid, values[i], callback=put_complete_callback, callback_data=i) + else: + #If we are waiting for each, or not waiting for anything, don't bother + #with callbacks. + out[i] = ca.put(chid, values[i], wait=wait_for_each, timeout=put_timeout) + if not wait_for_all: + return out + #All put requests have been submitted, now we wait... + with all_done: + while put_context["unfinished"] > 0: + elapsed_time = time.time() - t0 + remaining_time = put_timeout - elapsed_time + if remaining_time <= 0.0: + #Timeout expired, return the status of the puts. + return out + all_done.wait(remaining_time) + #If you get this far, all puts completed successfully within the timeout. return out diff --git a/tests/pv_unittest.py b/tests/pv_unittest.py index 8607fa3..d646c42 100755 --- a/tests/pv_unittest.py +++ b/tests/pv_unittest.py @@ -72,12 +72,40 @@ def test_caget_many(self): self.assertIsInstance(vals[1], int) self.assertIsInstance(vals[2], str) - def test_caput_many(self): - write('Simple Test of caput_many() function\n') + def test_caput_many_wait_all(self): + write('Test of caput_many() function, waiting for all.\n') pvs = [pvnames.double_pv, pvnames.enum_pv, 'ceci nest pas une PV'] + #pvs = ["MTEST:Val1", "MTEST:Val2", "MTEST:SlowVal"] vals = [0.5, 0, 23] - success = caput_many(pvs, vals, connection_timeout=0.5) + t0 = time.time() + success = caput_many(pvs, vals, wait='all', connection_timeout=0.5, put_timeout=5.0) + t1 = time.time() + self.assertEqual(len(success), len(pvs)) + self.assertEqual(success[0], 1) + self.assertEqual(success[1], 1) + self.failUnless(success[2] < 0) + + + def test_caput_many_wait_each(self): + write('Simple Test of caput_many() function, waiting for each.\n') + pvs = [pvnames.double_pv, pvnames.enum_pv, 'ceci nest pas une PV'] + #pvs = ["MTEST:Val1", "MTEST:Val2", "MTEST:SlowVal"] + vals = [0.5, 0, 23] + success = caput_many(pvs, vals, wait='each', connection_timeout=0.5, put_timeout=1.0) + self.assertEqual(len(success), len(pvs)) + self.assertEqual(success[0], 1) + self.assertEqual(success[1], 1) + self.failUnless(success[2] < 0) + + def test_caput_many_no_wait(self): + write('Simple Test of caput_many() function, without waiting.\n') + pvs = [pvnames.double_pv, pvnames.enum_pv, 'ceci nest pas une PV'] + #pvs = ["MTEST:Val1", "MTEST:Val2", "MTEST:SlowVal"] + vals = [0.5, 0, 23] + success = caput_many(pvs, vals, wait=None, connection_timeout=0.5) self.assertEqual(len(success), len(pvs)) + #If you don't wait, ca.put returns 1 as long as the PV connects + #and the put request is valid. self.assertEqual(success[0], 1) self.assertEqual(success[1], 1) self.failUnless(success[2] < 0) From bcad06ff0387cfd739cca830fa367c79a98ecb57 Mon Sep 17 00:00:00 2001 From: Matt Gibbs Date: Tue, 31 Oct 2017 13:41:36 -0700 Subject: [PATCH 10/23] Update docs for caput_many changes. --- doc/overview.rst | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/doc/overview.rst b/doc/overview.rst index b400e72..6bd1654 100644 --- a/doc/overview.rst +++ b/doc/overview.rst @@ -449,11 +449,17 @@ For detailed information about the arguments, see the documentation for :type pvlist: ``list`` or ``tuple`` of ``str`` :param values: values to put to each PV. :type values: ``list`` or ``tuple`` - :param wait: whether or not to wait for processing to complete (or time-out) for each put before returning. - :type wait: ``True``/``False`` - :param connection_timeout: maximum time to wait (in seconds) for a connection to be established to each PV. + :param wait: if ``'each'``, :func:`caput_many` will wait for each + PV to process before starting the next. If ``'all'``, + :func:`caput_many` will issue puts for all PVs immediately, then + wait for all of them to complete. If any other value, + :func:`caput_many` will not wait for put processing to complete. + :param connection_timeout: maximum time to wait (in seconds) for + a connection to be established to each PV. :type connection_timeout: float or ``None`` - :param put_timeout: maximum time to wait (in seconds) for processing to complete for each PV. + :param put_timeout: maximum time to wait (in seconds) for processing + to complete for each PV (if ``wait`` is ``'each'``), or for processing + to complete for all PVs (if ``wait`` is ``'all'``). :type put_timeout: float or ``None`` Because connections to channels normally connect very quickly (less than a From 18707567fa7962939450c7aba20397aa126b5a4c Mon Sep 17 00:00:00 2001 From: Matt Gibbs Date: Mon, 13 Nov 2017 23:29:46 -0800 Subject: [PATCH 11/23] Remove caget calling caget_many if handed a collection of PVs. --- epics/__init__.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/epics/__init__.py b/epics/__init__.py index 38e7173..44ded3f 100644 --- a/epics/__init__.py +++ b/epics/__init__.py @@ -78,15 +78,7 @@ def caget(pvname, as_string=False, count=None, as_numpy=True, to get a truncated amount of data from an array, you can specify the count with >>> x = caget('MyArray.VAL', count=1000) - - if pvname is a list of strings, caget_many is called instead. """ - if isinstance(pvname, (list, tuple)): - return caget_many(pvname, - as_string=as_string, - count=count, - as_numpy=as_numpy, - timeout=timeout) start_time = time.time() thispv = get_pv(pvname, timeout=timeout, connect=True) if thispv.connected: From 58dc8609d455f93070cdd2e2c181d89d7c65eea7 Mon Sep 17 00:00:00 2001 From: Matt Gibbs Date: Mon, 13 Nov 2017 23:33:39 -0800 Subject: [PATCH 12/23] Simplify caput_many by re-implementing with PV objects. --- epics/__init__.py | 85 +++++++++++++---------------------------------- 1 file changed, 24 insertions(+), 61 deletions(-) diff --git a/epics/__init__.py b/epics/__init__.py index 44ded3f..0d57c08 100644 --- a/epics/__init__.py +++ b/epics/__init__.py @@ -171,10 +171,10 @@ def caget_many(pvlist, as_string=False, count=None, as_numpy=True, timeout=5.0): return out def caput_many(pvlist, values, wait=False, connection_timeout=None, put_timeout=60): - """put values to a list of PVs - This does not maintain PV objects. If wait is 'each', - *each* put operation will block until it is complete. - or until the put_timeout duration expires. + """put values to a list of PVs, as fast as possible + This does not maintain the PV objects it makes. If + wait is 'each', *each* put operation will block until + it is complete or until the put_timeout duration expires. If wait is 'all', this method will block until *all* put operations are complete, or until the put_timeout duration expires. @@ -184,61 +184,24 @@ def caput_many(pvlist, values, wait=False, connection_timeout=None, put_timeout= was successful, or a negative number if the timeout was exceeded. """ - chids, conns = [], [] - for name in pvlist: chids.append(ca.create_channel(name, - auto_cb=False, - connect=False)) - for chid in chids: conns.append(ca.connect_channel(chid, - timeout=connection_timeout)) - #Number of put requests awaiting completion. Only used if wait=='all'. - #Reminder: acquire 'all_done' (defined further down) - #before using unfinished. - unfinished = len([conn for conn in conns if conn > 0]) - #mutex is used to coordinate access to 'unfinished'. - mutex = threading.Lock() - #Notify all_done if there are no remaining puts to complete. - #This function will block until all_done is notified, or - #the put_timeout expires. - all_done = threading.Condition(mutex) - t0 = time.time() - wait_for_each = (wait == "each") - wait_for_all = (wait == "all") - #'out' is a list of return statuses for each put request. 1 if success, -1 if fail. - #'out' is filled with fail to begin with. - out = [-1 for i in range(0,len(chids))] - #To get around the fact that you can't *assign* to variables while - #in put_complete_callback's scope, but you can modify them. - put_context = {"unfinished": unfinished, "all_done": all_done, "status": out} - def put_complete_callback(data=None, **kws): - #put_complete_callback is used in wait_all mode. - put_context["all_done"].acquire() - remaining = put_context["unfinished"] - 1 - put_context["status"][data] = 1 - if remaining <= 0: - #We're all done! - #Notify the main thread to stop waiting for puts to complete. - put_context["all_done"].notify_all() - put_context["unfinished"] = remaining - put_context["all_done"].release() - for (i, chid) in enumerate(chids): - if conns[i]: - if wait_for_all: - ca.put(chid, values[i], callback=put_complete_callback, callback_data=i) - else: - #If we are waiting for each, or not waiting for anything, don't bother - #with callbacks. - out[i] = ca.put(chid, values[i], wait=wait_for_each, timeout=put_timeout) - if not wait_for_all: - return out - #All put requests have been submitted, now we wait... - with all_done: - while put_context["unfinished"] > 0: - elapsed_time = time.time() - t0 - remaining_time = put_timeout - elapsed_time - if remaining_time <= 0.0: - #Timeout expired, return the status of the puts. - return out - all_done.wait(remaining_time) - #If you get this far, all puts completed successfully within the timeout. - return out + if len(pvlist) != len(values): + raise ValueError("List of PV names must be equal to list of values.") + out = [] + pvs = [PV(name, auto_monitor=False, connection_timeout=connection_timeout) for name in pvlist] + conns = [p.connected for p in pvs] + wait_all = (wait == 'all') + wait_each = (wait == 'each') + for p, v in zip(pvs, values): + out.append(p.put(v, wait=wait_each, timeout=put_timeout, use_complete=wait_all)) + if wait_all: + start_time = time.time() + while not all([(p.connected and p.put_complete) for p in pvs]): + ca.poll() + elapsed_time = time.time() - start_time + if elapsed_time > put_timeout: + break + return [1 if (p.connected and p.put_complete) else -1 for p in pvs] + else: + return [o if o == 1 else -1 for o in out] + From b35522e7d8e492f662d77da8d759a16c7de309c1 Mon Sep 17 00:00:00 2001 From: Matt Gibbs Date: Mon, 13 Nov 2017 23:35:24 -0800 Subject: [PATCH 13/23] Remove a line about auto-monitoring that didn't make any sense in caget_many and caput_many. --- doc/overview.rst | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/doc/overview.rst b/doc/overview.rst index 6bd1654..2d0f399 100644 --- a/doc/overview.rst +++ b/doc/overview.rst @@ -418,8 +418,7 @@ and the log file is inspected:: get a list of PVs as quickly as possible. Returns a list of values for each PV in the list. Unlike :func:`caget`, this method does not use - automatic monitoring (see :ref:`pv-automonitor-label`), even for large - waveform PVs. + automatic monitoring (see :ref:`pv-automonitor-label`). :param pvlist: A list of process variable names. :type pvlist: ``list`` or ``tuple`` of ``str`` @@ -443,7 +442,7 @@ For detailed information about the arguments, see the documentation for put values to a list of PVs as quickly as possible. Returns a list of ints for each PV in the list: 1 if the put was successful, -1 if it timed out. Unlike :func:`caput`, this method does not use automatic monitoring (see - :ref:`pv-automonitor-label`), even for large waveform PVs. + :ref:`pv-automonitor-label`). :param pvlist: A list of process variable names. :type pvlist: ``list`` or ``tuple`` of ``str`` From 964be2fdb9bfb8f939666126f5a325d2ced0ff29 Mon Sep 17 00:00:00 2001 From: Joshua Adelman Date: Thu, 30 Nov 2017 15:17:53 -0500 Subject: [PATCH 14/23] Fix MANIFEST.in to correct license file name --- MANIFEST.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MANIFEST.in b/MANIFEST.in index 189d7d2..ef7b493 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,4 +1,4 @@ -include README.txt INSTALL MANIFEST.in Changelog license.txt setup.py publish.sh *.bat versioneer.py +include README.txt INSTALL MANIFEST.in Changelog LICENSE setup.py publish.sh *.bat versioneer.py exclude *.pyc core.* *~ *.pdf recursive-include epics *.py recursive-include scripts * From 3c7cebeb1314107cab909ce6cac116b6e76c766c Mon Sep 17 00:00:00 2001 From: Daron Chabot Date: Tue, 5 Dec 2017 10:05:36 -0500 Subject: [PATCH 15/23] BUG: install all the libs --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index cbd4ae0..431b9f0 100644 --- a/setup.py +++ b/setup.py @@ -44,8 +44,8 @@ nolibca = os.environ.get('NOLIBCA', None) if nolibca is None: - pkg_data = {'epics.clibs': [epics.utils.clib_search_path("ca"), - epics.utils.clib_search_path("Com")],} + pkg_data = {'epics.clibs': ['darwin64/*', 'linux64/*', 'linux32/*', + 'win32/*', 'win64/*']} else: pkg_data = dict() From 16995b9af477461555916810fd0441690163e260 Mon Sep 17 00:00:00 2001 From: Matthew Newville Date: Thu, 14 Dec 2017 15:19:40 -0600 Subject: [PATCH 16/23] update docs for caget_many() and discussion of getting many PV values --- doc/advanced.rst | 197 +++++++++++++++++++++++++++++------------------ doc/overview.rst | 27 ++++--- 2 files changed, 136 insertions(+), 88 deletions(-) diff --git a/doc/advanced.rst b/doc/advanced.rst index c5a251c..0b67b67 100644 --- a/doc/advanced.rst +++ b/doc/advanced.rst @@ -90,96 +90,145 @@ to do this, say:: pv = epics.PV(name) pv_vals[name] = pv.get() -does incur some small performance penalty. As shown below, the penalty -is generally pretty small in absolute terms, but can be noticeable when -you are connecting to a large number (say, more than 100) PVs at once. +or even just:: -The cause for the penalty, and its remedy, are two-fold. First, a `PV` -object automatically use connection and event callbacks. Normally, these -are advantages, as you don't need to explicitly deal with them. But, -internally, they do pause for network responses using :meth:`ca.pend_event` -and these pauses can add up. Second, the :meth:`ca.get` also pauses for -network response, so that the returned value actually contains the latest -data right away, as discussed in the previous section. + values = [epics.caget(name) for name in pvnamelist] -The remedies are to - 1. not use connection or event callbacks. - 2. not explicitly wait for values to be returned for each :meth:`get`. -A more complicated but faster approach relies on a carefully-tuned use of -the CA library, and would be the following:: +does incur some performance penalty. To minimize the penalty, we need to +understand its cause. +Creating a `PV` object (using any of :class:`pv.PV`, or :func:`pv.get_pv`, +or :func:`epics.caget`) will automatically use connection and event +callbacks in an attempt to keep the `PV` alive and up-to-date during the +seesion. Normally, this is an advantage, as you don't need to explicitly +deal with many aspects of Channel Access. But creating a `PV` does request +some network traffic, and the `PV` will not be "fully connected" and ready +to do a :meth:`PV.get` until all the connection and event callbacks are +established. In fact, :meth:`PV.get` will not run until those connections +are all established. This takes very close to 30 milliseconds for each PV. +That is, for 1000 PVs, the above approach will take about 30 seconds. + +The simplest remedy is to allow all those connections to happen in parallel +and in the background by first creating all the PVs and then getting their +values. That would look like:: + + # improve time to get multiple PVs: Method 1 + import epics + + pvnamelist = read_list_pvs() + pvs = [epics.PV(name) for name in pvnamelist] + values = [p.get() for p in pvs] + +Though it doesn't look that different, this improves performance by a +factor of 100, so that getting 1000 PV values will take around 0.4 seconds. + +Can it be improved further? The answer is Yes, but at a price. For the +discussion here, we'll can the original version "Method 0" and the method +of creating all the PVs then getting their values "Method 1". With both of +these approaches, the script has fully connected PV objects for all PVs +named, so that subsequent use of these PVs will be very efficient. + +But this can be made even faster by turning off any connection or event +callbacks, avoiding `PV` objects altogether, and using the `epics.ca` +interface. This has been encapsulated into :func:`epics.caget_many` which +can be used as:: + + # get multiple PVs as fast as possible: Method 2 + import epics + pvnamelist = read_list_pvs() + values = epics.caget_many(pvlist) + +In tests using 1000 PVs that were all really connected, Method 2 will take +about 0.25 seconds, compared to 0.4 seconds for Method 1 and 30 seconds for +Method 0. To understand what :func:`epics.caget_many` is doing, a more +complete version of this looks like this:: + + # epics.caget_many made explicit: Method 3 from epics import ca pvnamelist = read_list_pvs() pvdata = {} + pvchids = [] + # create, don't connect or create callbacks for name in pvnamelist: chid = ca.create_channel(name, connect=False, auto_cb=False) # note 1 - pvdata[name] = (chid, None) + pvchids.append(chid) - for name, data in pvdata.items(): - ca.connect_channel(data[0]) + # connect + for chid in pvchids: + ca.connect_channel(chid) + + # request get, but do not wait for result ca.poll() - for name, data in pvdata.items(): - ca.get(data[0], wait=False) # note 2 + for chid in pvchids: + ca.get(chid, wait=False) # note 2 + # now wait for get() to complete ca.poll() - for name, data in pvdata.items(): + for chid in pvchids: val = ca.get_complete(data[0]) - pvdata[name][1] = val - - for name, data in pvdata.items(): - print name, data[1] - -The code here probably needs detailed explanation. The first thing to -notice is that this is using the `ca` level, not `PV` objects. Second -(Note 1), the `connect=False` and `auto_cb=False` options to -:meth:`ca.create_channel`. These respectively tell -:meth:`ca.create_channel` to not wait for a connection before returning, -and to not automatically assign a connection callback. Normally, these are -not what you want, as you want a connected channel and to know if the -connection state changes. But we're aiming for maximum speed here, so we -avoid these. - -We then explicitly call :meth:`ca.connect_channel` for all the channels. -Next (Note 2), we tell the CA library to request the data for the channel -without waiting around to receive it. The main point of not having -:meth:`ca.get` wait for the data for each channel as we go is that each -data transfer takes time. Instead we request data to be sent in a separate -thread for all channels without waiting. Then we do wait by calling -:meth:`ca.poll` once and only once, (not len(channels) times!). Finally, -we use the :meth:`ca.get_complete` method to convert the data that has now -been received by the companion thread to a python value. - -How much faster is the more explicit method? In my tests, I used 20,000 -PVs, all scalar values, all actually connected, and all on the same subnet -as the test client, though on a mixture of several vxWorks and linux IOCs. -I found that the simplest, obvious approach as above took around 12 seconds -to read all 20,000 PVs. Using the `ca` layer with connection callbacks and -a normal call to :meth:`ca.get` also took about 12 seconds. The method -without connection callbacks and with delayed unpacking above took about 2 -seconds to read all 20,000 PVs. - -Is that performance boost from 12 to 2 seconds significant? If you're -writing a script that is intended to run once, fetch a large number of PVs -and get their values (say, an auto-save script that runs on demand), then -the boost is definitely significant. On the other hand, if you're writing -a long running process or a process that will retain the PV connections and -get their values multiple times, the difference in start-up speed is less -significant. For a long running auto-save script that periodically writes -out all the PV values, the "obvious" way using automatically monitored PVs -may be much *better*, as the time for the initial connection is small, and -the use of event callbacks will reduce network traffic for PVs that don't -change between writes. - -Note that the tests also show that, with the simplest approach, 1,000 PVs -should connect and receive values in under 1 second. Any application that -is sure it needs to connect to PVs faster than that rate will want to do -careful timing tests. Finally, note also that the issues are not really a -classic *python is slow compared to C* issue, but rather a matter of how -much pausing with :meth:`ca.poll` one does to make sure values are -immediately useful. + pvdata[ca.name(chid)] = val + +The code here probably needs detailed explanation. As mentioned above, it +uses the `ca` level, not `PV` objects. Second, the call to +:meth:`ca.create_channel` (Note 1) uses `connect=False` and `auto_cb=False` +which mean to not wait for a connection before returning, and to not +automatically assign a connection callback. Normally, these are not what +you want, as you want a connected channel and to be informed if the +connection state changes, but we're aiming for maximum speed here. We then +use :meth:`ca.connect_channel` to connect all the channels. Next (Note 2), +we tell the CA library to request the data for the channel without waiting +around to receive it. The main point of not having :meth:`ca.get` wait for +the data for each channel as we go is that each data transfer takes time. +Instead we request data to be sent in a separate thread for all channels +without waiting. Then we do wait by calling :meth:`ca.poll` once and only +once, (not `len(pvnamelist)` times!). Finally, we use the +:meth:`ca.get_complete` method to convert the data that has now been +received by the companion thread to a python value. + +Method 2 and 3 have essentially the same runtime, which is somewhat faster +than Method 1, and much faster than Method 0. Which method you should use +depends on use case. In fact, the test shown here only gets the PV values +once. If you're writing a script to get 1000 PVs, write them to disk, and +exit, then Method 2 (:func:`epics.caget_many`) may be exactly what you +want. But if your script will get 1000 PVs and stay alive doing other +work, or even if it runs a loop to get 1000 PVs and write them to disk once +a minute, then Method 1 will actually be faster. That is doing +:func:`epics.caget_many` in a loop, as with:: + + # caget_many() 10 times + import epics + import time + pvnamelist = read_list_pvs() + for i in range(10): + values = epics.caget_many(pvlist) + time.sleep(0.01) + +will take around considerably *longer* than creating the PVs once and +getting their values in a loop with:: + + # pv.get() 10 times + import epics + import time + pvnamelist = read_list_pvs() + pvs = [epics.PV(name) for name in pvnamelist] + for i in range(10): + values = [p.get() for p in pvs] + time.sleep(0.01) + +In tests with 1000 PVs, looping with :func:`epics.caget_many` took about +1.5 seconds, while the version looping over :meth:`PV.get()` took about 0.5 +seconds. + +To be clear, it is **connecting** to Epics PVs that is expensive, not the +retreiving of data from connected PVs. You can lower the connection +expense by not retaining the connection or creating monitors on the PVs, +but if you are going to re-use the PVs, that savings will be lost quickly. +In short, use Method 1 over :func:`caget_many` unless you've benchmarked +your use-case and have demonstrated that :func:`caget_many` is better for +your needs. .. _advanced-sleep-label: diff --git a/doc/overview.rst b/doc/overview.rst index 2d0f399..d6bd849 100644 --- a/doc/overview.rst +++ b/doc/overview.rst @@ -179,9 +179,9 @@ quite good. .. function:: caget(pvname[, as_string=False[, count=None[, as_numpy=True[, timeout=None[, use_monitor=False]]]]]) - retrieves and returns the value of the named PV(s). + retrieves and returns the value of the named PV. - :param pvname: name of Epics Process Variable or list of names. + :param pvname: name of Epics Process Variable. :param as_string: whether to return string representation of the PV value. :type as_string: ``True``/``False`` :param count: number of elements to return for array data. @@ -193,9 +193,6 @@ quite good. :param use_monitor: whether to rely on monitor callbacks or explicitly get value now. :type use_monitor: ``True``/``False`` -If *pvname* is a list of strings, :func:`caget_many` will be called -instead with the same arguments. - The *count* and *as_numpy* options apply only to array or waveform data. The default behavior is to return the full data array and convert to a numpy array if available. The *count* option can be used to explicitly @@ -417,9 +414,9 @@ and the log file is inspected:: .. function:: caget_many(pvlist[, as_string=False[, count=None[, as_numpy=True[, timeout=None]]]]) get a list of PVs as quickly as possible. Returns a list of values for - each PV in the list. Unlike :func:`caget`, this method does not use + each PV in the list. Unlike :func:`caget`, this method does not use automatic monitoring (see :ref:`pv-automonitor-label`). - + :param pvlist: A list of process variable names. :type pvlist: ``list`` or ``tuple`` of ``str`` :param as_string: whether to return string representation of the PV values. @@ -430,9 +427,10 @@ and the log file is inspected:: :type as_numpy: ``True``/``False`` :param timeout: maximum time to wait (in seconds) for value before returning None. :type timeout: float or ``None`` - + For detailed information about the arguments, see the documentation for -:func:`caget`. +:func:`caget`. Also see :ref:`advanced-connecting-many-label` for more +discussion. :func:`caput_many` ~~~~~~~~~~~~~~~~~~ @@ -443,30 +441,31 @@ For detailed information about the arguments, see the documentation for for each PV in the list: 1 if the put was successful, -1 if it timed out. Unlike :func:`caput`, this method does not use automatic monitoring (see :ref:`pv-automonitor-label`). - + :param pvlist: A list of process variable names. :type pvlist: ``list`` or ``tuple`` of ``str`` :param values: values to put to each PV. :type values: ``list`` or ``tuple`` - :param wait: if ``'each'``, :func:`caput_many` will wait for each + :param wait: if ``'each'``, :func:`caput_many` will wait for each PV to process before starting the next. If ``'all'``, :func:`caput_many` will issue puts for all PVs immediately, then wait for all of them to complete. If any other value, :func:`caput_many` will not wait for put processing to complete. - :param connection_timeout: maximum time to wait (in seconds) for + :param connection_timeout: maximum time to wait (in seconds) for a connection to be established to each PV. :type connection_timeout: float or ``None`` :param put_timeout: maximum time to wait (in seconds) for processing to complete for each PV (if ``wait`` is ``'each'``), or for processing to complete for all PVs (if ``wait`` is ``'all'``). :type put_timeout: float or ``None`` - + Because connections to channels normally connect very quickly (less than a -second), but processing a put may take a significant amount of time (due to +second), but processing a put may take a significant amount of time (due to a physical device moving, or due to complex calculations or data processing sequences), a separate timeout duration can be specified for connections and processing puts. + Motivation: Why another Python-Epics Interface? ================================================ From aca9d14dd916be2b38a287494e33e2696c114e52 Mon Sep 17 00:00:00 2001 From: Matthew Newville Date: Sun, 17 Dec 2017 12:32:19 -0600 Subject: [PATCH 17/23] more updates to doc for caget/caput/... interface --- doc/overview.rst | 341 +++++++++++++++++++++++++---------------------- 1 file changed, 179 insertions(+), 162 deletions(-) diff --git a/doc/overview.rst b/doc/overview.rst index d6bd849..b0a5a2a 100644 --- a/doc/overview.rst +++ b/doc/overview.rst @@ -3,12 +3,12 @@ PyEpics Overview ============================================ -The python :mod:`epics` package consists of several function, modules, and +The python :mod:`epics` package provides several function, modules, and classes to interact with EPICS Channel Access. The simplest approach uses -the functions :func:`caget`, :func:`caput`, :func:`cainfo`, -:func:`camonitor`, and :func:`camonitor_clear` within the top-level `epics` -module. These functions are similar to the standard command line utilities -and to the EZCA library interface, and are described in more detail below. +the functions :func:`caget`, :func:`caput`, and :func:`cainfo` within the +top-level `epics` module to get and put values of Epics Process Variables. +These functions are similar to the standard command line utilities and the +EZCA library interface, and are described in more detail below. To use the :mod:`epics` package, import it with:: @@ -16,14 +16,15 @@ To use the :mod:`epics` package, import it with:: The main components of this module include - * functions :func:`caget`, :func:`caput`, :func:`camonitor`, - :func:`camonitor_clear`, and :func:`cainfo` as described below. - * a :mod:`ca` module, providing the low-level Epics Channel Access - library as a set of functions. - * a :class:`PV` object, giving a higher-level interface to Epics - Channel Access. - * a :class:`Device` object: a collection of related PVs - * a :class:`Motor` object: a mapping of an Epics Motor + * functions :func:`caget`, :func:`caput`, :func:`cainfo` and others + described in more detail below. + * a :mod:`ca` module, providing the low-level library as a set of + functions, meant to be very close to the C library for Channel Access. + * a :class:`PV` object, representing a Process Variable (PV) and giving + a higher-level interface to Epics Channel Access. + * a :class:`Device` object: a collection of related PVs, similar to an + Epics Record. + * a :class:`Motor` object: a Device that represents an Epics Motor. * an :class:`Alarm` object, which can be used to set up notifications when a PV's values goes outside an acceptable bounds. * an :mod:`epics.wx` module that provides wxPython classes designed for @@ -35,10 +36,11 @@ where you want to start. If you're building larger scripts and programs, using :class:`PV` objects provided by the :mod:`pv` module is recommended. The :class:`PV` class -provides a Process Variable object that has both methods (including +provides a Process Variable (PV) object that has both methods (including :meth:`get` and :meth:`put`) to read and change the PV, and attributes that are kept automatically synchronized with the remote channel. For larger -applications, you may find the :class:`Device` class helpful. +applications where you find yourself working with sets of related PVs, you +may find the :class:`Device` class helpful. The lowest-level CA functionality is exposed in the :mod:`ca` module, and companion :mod:`dbr` module. While not necessary recommended for most use @@ -51,9 +53,8 @@ In addition, the `epics` package contains more specialized modules for alarms, Epics motors, and several other *devices* (collections of PVs), and a set of wxPython widget classes for using EPICS PVs with wxPython. -The `epics` package is targeted for use on Unix-like systems (including -Linux and Mac OS X) and Windows with Python versions 2.5, 2.6, 2.7, and -3.1, and 3.2. +The `epics` package is supported and well-tested on Linux, Mac OS X, and +Windows with Python versions 2.7, and 3.5 and above. Quick Start @@ -69,29 +70,61 @@ Functional Approach: caget(), caput() To get values from PVs, you can use the :func:`caget` function: - >>> from epics import caget, caput - >>> m1 = caget('XXX:m1.VAL') - >>> print m1 - 1.2001 + >>> from epics import caget, caput, cainfo + >>> m1 = caget('XXX:m1.VAL') + >>> print(m1) + 1.2001 To set PV values, you can use the :func:`caput` function: - >>> caput('XXX:m1.VAL', 1.90) - >>> print caget('XXX:m1.VAL') - 1.9000 + >>> caput('XXX:m1.VAL', 1.90) + >>> print(caget('XXX:m1.VAL')) + 1.9000 -For many cases, this approach is ideal because of its simplicity and -clarity. +To see more detailed information about a PV, use the :func:`cainfo` +function: -Object Oriented Approach: PV + >>> cainfo('XXX:m1.VAL') + == XXX:m1.VAL (time_double) == + value = 1.9 + char_value = '1.9000' + count = 1 + nelm = 1 + type = time_double + units = mm + precision = 4 + host = somehost.aps.anl.gov:5064 + access = read/write + status = 0 + severity = 0 + timestamp = 1513352940.872 (2017-12-15 09:49:00.87179) + posixseconds = 1513352940.0 + nanoseconds= 871788105 + upper_ctrl_limit = 50.0 + lower_ctrl_limit = -48.0 + upper_disp_limit = 50.0 + lower_disp_limit = -48.0 + upper_alarm_limit = 0.0 + lower_alarm_limit = 0.0 + upper_warning_limit = 0.0 + lower_warning_limit = 0.0 + PV is internally monitored, with 0 user-defined callbacks: + ============================= + +The simplicity and clarity of these functions make them ideal for many +cases. + + + +Creating and Using PV Objects ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -If you want to repeatedly access the same PV, you may find it more -convenient to ''create a PV object'' and use it in a more object-oriented +If you are repeatedly referencing the same PV, you may find it more +convenient to create a PV object and use it in a more object-oriented manner. - >>> from epics import PV - >>> pv1 = PV('XXX:m1.VAL') + >>> from epics import PV + >>> pv1 = PV('XXX:m1.VAL') PV objects have several methods and attributes. The most important methods are :meth:`get` and :meth:`put` to receive and send the PV's value, and @@ -99,61 +132,63 @@ the :attr:`value` attribute which stores the current value. In analogy to the :func:`caget` and :func:`caput` examples above, the value of a PV can be fetched either with - >>> print pv1.get() - 1.2001 + >>> print(pv1.get()) + 1.90 or - >>> print pv1.value - 1.2001 + >>> print(pv1.value) + 1.90 To set a PV's value, you can either use - >>> pv1.put(1.9) + >>> pv1.put(1.9) or assign the :attr:`value` attribute - >>> pv1.value = 1.9 + >>> pv1.value = 1.9 You can see a few of the most important properties of a PV by simply printing it: - >>> print pv1 - + >>> print(pv1) + Even more complete information can be seen by printing the PVs :attr:`info` attribute:: - >>> print pv1.info - == XXX:m1.VAL (native_double) == - value = 1.9 - char_value = '1.90000' - count = 1 - nelm = 1 - type = double - units = mm - precision = 5 - host = somehost.cars.aps.anl.gov:5064 - access = read/write - status = 0 - severity = 0 - timestamp = 1265996457.212 (2010-Feb-12 11:40:57.212) - upper_ctrl_limit = 12.5 - lower_ctrl_limit = -12.3 - upper_disp_limit = 12.5 - lower_disp_limit = -12.3 - upper_alarm_limit = 0.0 - lower_alarm_limit = 0.0 - upper_warning_limit = 0.0 - lower_warning_limit = 0.0 - PV is internally monitored, with 0 user-defined callbacks: - ============================= - -PV objects have several additional methods, especially related to -monitoring changes to the PVs and defining functions to be run when the -value does change. There are also attributes associated with a PVs -*Control Attributes*, like those shown above in the :attr:`info` attribute. -Further details are at :ref:`pv-label`. + >>> print(pv1.info) + == XXX:m1.VAL (time_double) == + value = 1.9 + char_value = '1.9000' + count = 1 + nelm = 1 + type = time_double + units = mm + precision = 4 + host = somehost.aps.anl.gov:5064 + access = read/write + status = 0 + severity = 0 + timestamp = 1513352940.872 (2017-12-15 09:49:00.87179) + posixseconds = 1513352940.0 + nanoseconds= 871788105 + upper_ctrl_limit = 50.0 + lower_ctrl_limit = -48.0 + upper_disp_limit = 50.0 + lower_disp_limit = -48.0 + upper_alarm_limit = 0.0 + lower_alarm_limit = 0.0 + upper_warning_limit = 0.0 + lower_warning_limit = 0.0 + PV is internally monitored, with 0 user-defined callbacks: + ============================= + +PV objects have several additional methods related to monitoring changes to +the PV values or connection state including user-defined functions to be +run when the value changes. There are also attributes associated with a +PVs *Control Attributes*, like those shown above in the :attr:`info` +attribute. Further details are at :ref:`pv-label`. Functions defined in :mod:`epics`: caget(), caput(), etc. @@ -162,17 +197,21 @@ Functions defined in :mod:`epics`: caget(), caput(), etc. .. module:: epics :synopsis: top-level epics module, and container for simplest CA functions -The simplest interface to EPICS Channel Access provides functions -:func:`caget`, :func:`caput`, as well as functions :func:`camonitor`, -:func:`camonitor_clear`, and :func:`cainfo`. These functions are similar -to the EPICS command line utilities and to the functions in the EZCA -library. They all take the name of an Epics Process Variable (PV) as the -first argument. As with the EZCA library, the python implementation keeps -an internal cache of connected PV (in this case, using `PV` objects) so -that repeated use of a PV name will not actually result in a new connection --- see :ref:`pv-cache-label` for more details. Thus, though the -functionality is limited, the performance of the functional approach can be -quite good. +As shown above, the simplest interface to EPICS Channel Access is found +with the functions :func:`caget`, :func:`caput`, and :func:`cainfo`. There +are also functions :func:`camonitor` and :func:`camonitor_clear` to setup +and clear a simple monitoring of changes to a PV. These functions all take +the name of an Epics Process Variable (PV) as the first argument and are +similar to the EPICS command line utilities of the same names. + +Internally, these functions keeps a cache of connected PV (in this case, +using `PV` objects) so that repeated use of a PV name will not actually +result in a new connection to the PV -- see :ref:`pv-cache-label` for more +details. Thus, though the functionality is simple and straightforward, the +performance of using thes simple function can be quite good. In addition, +there are also functions :func:`caget_many` and :func:`caput_many` for +getting and putting values for multiple PVs at a time. + :func:`caget` ~~~~~~~~~~~~~ @@ -210,10 +249,9 @@ underlying PV. The default is ``False``, so that each :func:`caget` will explicitly ask the value to be sent instead of relying on the automatic monitoring normally used for persistent PVs. This makes :func:`caget` act more like command-line tools, and slightly less efficient than creating a -PV and getting values with it. If ultimate performance is a concern, using -monitors is recommended. For more details on making :func:`caget` more -efficient, see :ref:`pv-automonitor-label` and -:ref:`advanced-get-timeouts-label`. +PV and getting values with it. If performance is a concern, using monitors +is recommended. For more details on making :func:`caget` more efficient, +see :ref:`pv-automonitor-label` and :ref:`advanced-get-timeouts-label`. The *as_string* argument tells the function to return the **string representation** of the value. The details of the string representation @@ -224,53 +262,52 @@ used to format the string value. For enum types, the name of the enum state is returned:: >>> from epics import caget, caput, cainfo - >>> print caget('XXX:m1.VAL') # A double PV + >>> print(caget('XXX:m1.VAL')) # A double PV 0.10000000000000001 - >>> print caget('XXX:m1.DESC') # A string PV + >>> print(caget('XXX:m1.DESC')) # A string PV 'Motor 1' - >>> print caget('XXX:m1.FOFF') # An Enum PV + >>> print(caget('XXX:m1.FOFF')) # An Enum PV 1 Adding the `as_string=True` argument always results in string being -returned, with the conversion method depending on the data type:: +returned, with the conversion method depending on the data type, for +example using the precision field of a double PV to determine how to format +the string, or using the names of the enumeration states for an enum PV:: - >>> print caget('XXX:m1.VAL', as_string=True) + >>> print(caget('XXX:m1.VAL', as_string=True)) '0.10000' - >>> print caget('XXX:m1.FOFF', as_string=True) + >>> print(caget('XXX:m1.FOFF', as_string=True)) 'Frozen' -For most array data from Epics waveform records, the regular value will be -a numpy array (or a python list if numpy is not installed). The string -representation will be something like '' -depending on the size and type of the waveform. An array of doubles might -be:: +For integer or double array data from Epics waveform records, the regular +value will be a numpy array (or a python list if numpy is not installed). +The string representation will be something like '' depending on the size and type of the waveform. An array of +doubles might be:: - >>> print caget('XXX:scan1.P1PA') # A Double Waveform + >>> print(caget('XXX:scan1.P1PA')) # A Double Waveform array([-0.08 , -0.078 , -0.076 , ..., 1.99599814, 1.99799919, 2. ]) - >>> print caget('XXX:scan1.P1PA', as_string=True) - '' + >>> print(caget('XXX:scan1.P1PA', as_string=True)) + '' -As an important special case, CHAR waveforms will be turned to Python +As an important special case CHAR waveform records will be turned to Python strings when *as_string* is ``True``. This is useful to work around the -low limit of the maximum length (40 characters!) of EPICS strings, and -means that it is fairly common to use CHAR waveforms when long strings are -desired:: +low limit of the maximum length (40 characters!) of EPICS strings which has +inspired the fairly common usage of CHAR waveforms to represent longer +strings:: - >>> print caget('XXX:dir') # A CHAR waveform - array([ 84, 58, 92, 120, 97, 115, 95, 117, 115, - 101, 114, 92, 77, 97, 114, 99, 104, 50, 48, - 49, 48, 92, 70, 97, 115, 116, 77, 97, 112]) + >>> epics.caget('MyAD:TIFF1:FilePath') + array([ 47, 104, 111, 109, 101, 47, 101, 112, 105, 99, 115, 47, 115, + 99, 114, 97, 116, 99, 104, 47, 0], dtype=uint8) + >>> epics.caget('MyAD:TIFF1:FilePath', as_string=True) + '/home/epics/scratch/' - >>> print caget('XXX:dir',as_string=True) - 'T:\\xas_user\\March2010\\Fastmap' - -Of course,character waveforms are not always used for long strings, but -can also hold byte array data, such as comes from some detectors and -devices. +Of course,character waveforms are not always used for long strings, but can +also hold byte array data, such as comes from some detectors and devices. :func:`caput` ~~~~~~~~~~~~~~~~ @@ -397,7 +434,7 @@ and the log file is inspected:: >>> epics.camonitor_clear('XXX:DMM1Ch2_calc.VAL') >>> fh.close() >>> fh = open('PV1.log','r') - >>> for i in fh.readlines(): print i[:-1] + >>> for i in fh.readlines(): print(i[:-1]) XXX:DMM1Ch2_calc.VAL 2010-03-24 11:56:40.536946 -183.5035 XXX:DMM1Ch2_calc.VAL 2010-03-24 11:56:41.536757 -183.6716 XXX:DMM1Ch2_calc.VAL 2010-03-24 11:56:42.535568 -183.5112 @@ -466,70 +503,50 @@ sequences), a separate timeout duration can be specified for connections and processing puts. -Motivation: Why another Python-Epics Interface? +Motivation and design concepts ================================================ -PyEpics version 3 is intended as an improvement over EpicsCA 2.1, and -should replace that older Epics-Python interface. That version had -performance issues, especially when connecting to a large number of PVs, is -not thread-aware, and has become difficult to maintain for Windows and -Linux. - -There are a few other Python modules exposing Epics Channel Access -available. Most of these have a interface to the CA library that was both -closer to the C library and lower-level than EpicsCA. Most of these -interfaces use specialized C-Python 'wrapper' code to provide the -interface. - -Because of this, an additional motivation for this package was to allow a -more common interface to be used that built higher-level objects (as -EpicsCA had) on top of a complete lower-level interface. The desire to -come to a more universally-acceptable Python-Epics interface has definitely -influenced the goals for this module, which include: - - 1) providing both low-level (C-like) and higher-level access (Pythonic +There are other Python wrappings for Epics Channel Access, so it it useful +to outline the design goals for PyEpics. The motivations for PyEpics3 +included: + + 1) providing both low-level (C-like) and higher-level access (Python objects) to the EPICS Channel Access protocol. 2) supporting as many features of Epics 3.14 as possible, including preemptive callbacks and thread support. 3) easy support and distribution for Windows and Unix-like systems. - 4) being ready for porting to Python3. + 4) support for both Python 2 and Python 3. 5) using Python's ctypes library. -The main implementation feature used here (and difference from EpicsCA) is -using Python's ctypes library to handle the connection between Python and -the CA C library. Using ctypes has many advantages. Principally, it fully -eliminates the need to write (and maintain) wrapper code either with SWIG -or directly with Python's C API. Since the ctypes module allows access to -C data and objects in pure Python, no compilation step is needed to build -the module, making installation and support on multiple platforms much -easier. Since ctypes loads a shared object library at runtime, the -underlying Epics Channel Access library can be upgraded without having to -re-build the Python wrapper. In addition, using ctypes provides the most -reliable thread-safety available, as each call to the underlying C library -is automatically made thread-aware without explicit code. Finally, by -avoiding the C API altogether, migration to Python3 is greatly simplified. -PyEpics3 does work with both Python 2.* and 3.*. - - -Status and To-Do List +The idea is to provide both a low-level interface to Epics Channel Access +(CA) that closely resembled the C interface to CA, and to build higher +level functionality and complex objects on top of that foundation. The +Python ctypes library conveniently allows such direct wrapping of a shared +libraries, and requires no compiled code for the bridge between Python and +the CA library. This makes it very easy to wrap essentially all of CA from +Python code, and support multiple platforms. Since ctypes loads a shared +object library at runtime, the underlying CA library can be upgraded +without having to re-build the Python wrapper. The ctypes interface +provides the most reliable thread-safety available, as each call to the +underlying C library is automatically made thread-aware without explicit +code. Finally, by avoiding the C API altogether, supporting both Python2 +and Python3 is greatly simplified. + +Status and to-do list ======================= -The PyEpics package is actively maintained, but the core library seems +The PyEpics package is actively maintained, but the core library is reasonably stable and ready to use in production code. Features are being -added slowly, and testing is integrated into development so that the -chance of introducing bugs into existing codes is minimized. The package -is targeted and tested to work with Python 2.6, 2.7, 3.2 and 3.3 -simultaneously (that is, the same code is meant to support all these -versions). +added slowly, and testing is integrated into development so that the chance +of introducing bugs into existing codes is minimized. The package is +targeted and tested to work with Python 2.7 and Python 3 simultaneously. -There are several desired features are left unfinished: +There are several desired features are left unfinished or could use +improvement: * add more Epics Devices, including low-level epics records and more suport for Area Detectors. - * incorporate some or all of the Channel Access Server from `pcaspy - `_ - * build and improve applications using PyEpics, especially for common data acquisition needs. From b9c25433b85661728e0bf60bef2dfecc4db7bfba Mon Sep 17 00:00:00 2001 From: Matthew Newville Date: Sun, 17 Dec 2017 12:32:56 -0600 Subject: [PATCH 18/23] tweaks to install doc, use sphinx release directive --- doc/installation.rst | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/doc/installation.rst b/doc/installation.rst index 5726f03..0db4e0d 100644 --- a/doc/installation.rst +++ b/doc/installation.rst @@ -13,7 +13,7 @@ older versions of Python, but these are rarely tested. For Windows, use of pyepics with IronPython (Python written with .NET) has been recently reported, but is not routinely tested. -Version 3.14 or higher of the EPICS Channel Access library is required for +The EPICS Channel Access library Version 3.14 or higher is required for pyepics to actually communicate with Epics variables. Specifically, the shared libraries libca and libCom (*libca.so* and *libCom.so* on Linux, *libca.dylib* and *libCom.dylib* on Mac OSX, or *ca.dll* and *Com.dll* on @@ -48,15 +48,15 @@ Downloads and Installation .. _pyepics CARS downloads: http://cars9.uchicago.edu/software/python/pyepics3/src/ -The latest stable version of the pyepics package is 3.3.0. Source code +The latest stable version of the pyepics package is |release|. Source code kits and Windows installers can be found at `pyepics PyPI`_. With `Python Setup Tools`_ now standard for Python 2.7 and above, the simplest way to install the pyepics is with:: pip install pyepics -If you're using Anaconda, there are a few conda channels for pyepics, -including:: +If you're using Anaconda Python, there are a few conda channels for +pyepics, including:: conda install -c GSECARS pyepics @@ -64,9 +64,10 @@ You can also download the source package, unpack it, and install with:: python setup.py install -If you know that you will not want to use the default version of *libca*, -you can suppress the installation of the default versions by setting the -environmental variable `NOLIBCA` at install time, as with:: +If you are certain that you will not want to use the default version of +*libca* that pyepics provides and is tested with, you can suppress the +installation of the default versions by setting the environmental variable +`NOLIBCA` at install time, as with:: NOLIBCA=1 python setup.py install @@ -182,10 +183,10 @@ pyepics was originally written and is maintained by Matt Newville . Many important contributions to the library have come from Angus Gratton while at the Australian National University, and from Daron Chabot and Ken Lauer. Several other people have provided -valuable additions, suggestions, or bug reports, which has greatly improved -the quality of the library: Robbie Clarken, Daniel Allen, Michael Abbott, -Thomas Caswell, Alain Peteut, Steven Hartmann, Rokvintar, Georg Brandl, -Niklas Claesson, Jon Brinkmann, Marco Cammarata, Craig Haskins, David Vine, -Pete Jemian, Andrew Johnson, Janko Kolar, Irina Kosheleva, Tim Mooney, Eric -Norum, Mark Rivers, Friedrich Schotte, Mark Vigder, Steve Wasserman, and -Glen Wright. +valuable additions, suggestions, pull requests or bug reports, which has +greatly improved the quality of the library: Robbie Clarken, Daniel Allen, +Michael Abbott, Thomas Caswell, Alain Peteut, Steven Hartmann, Rokvintar, +Georg Brandl, Niklas Claesson, Jon Brinkmann, Marco Cammarata, Craig +Haskins, David Vine, Pete Jemian, Andrew Johnson, Janko Kolar, Irina +Kosheleva, Tim Mooney, Eric Norum, Mark Rivers, Friedrich Schotte, Mark +Vigder, Steve Wasserman, and Glen Wright. From ff90cac249fe1c80a110651cf71a5563a2902e79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20Schr=C3=B6der?= Date: Tue, 16 Aug 2022 09:54:35 +0200 Subject: [PATCH 19/23] New upstream version 3.4.3 --- .github/PULL_REQUEST_TEMPLATE.md | 5 + .travis.yml | 2 +- doc/advanced.rst | 54 +- doc/arrays.rst | 32 +- doc/ca.rst | 159 ++-- doc/index.rst | 39 +- doc/installation.rst | 107 +-- doc/overview.rst | 20 +- doc/pv.rst | 99 +- epics/__init__.py | 85 +- epics/_version.py | 6 +- epics/alarm.py | 40 +- epics/autosave/save_restore.py | 16 +- epics/ca.py | 1071 +++++++++++++--------- epics/clibs/darwin64/README | 21 + epics/clibs/darwin64/libCom.dylib | Bin 588344 -> 0 bytes epics/clibs/darwin64/libComPYEPICS.dylib | Bin 0 -> 565564 bytes epics/clibs/darwin64/libca.dylib | Bin 572040 -> 534596 bytes epics/clibs/linux32/README | 23 + epics/clibs/linux32/libCom.so | Bin 1059392 -> 0 bytes epics/clibs/linux32/libComPYEPICS.so | Bin 0 -> 1346940 bytes epics/clibs/linux32/libca.so | Bin 1821244 -> 1972480 bytes epics/clibs/linux64/README | 20 + epics/clibs/linux64/libCom.so | Bin 1919896 -> 0 bytes epics/clibs/linux64/libComPYEPICS.so | Bin 0 -> 1637896 bytes epics/clibs/linux64/libca.so | Bin 2878544 -> 2484712 bytes epics/clibs/linuxarm/README | 16 + epics/clibs/linuxarm/libComPYEPICS.so | Bin 0 -> 1629788 bytes epics/clibs/linuxarm/libca.so | Bin 0 -> 2233352 bytes epics/clibs/win32/Com.dll | Bin 240640 -> 345088 bytes epics/clibs/win32/README | 2 + epics/clibs/win32/ca.dll | Bin 223232 -> 239104 bytes epics/clibs/win32/caRepeater.exe | Bin 0 -> 5632 bytes epics/clibs/win32/carepeater.exe | Bin 6656 -> 0 bytes epics/clibs/win64/Com.dll | Bin 328704 -> 430592 bytes epics/clibs/win64/README | 2 + epics/clibs/win64/ca.dll | Bin 306176 -> 303104 bytes epics/clibs/win64/caRepeater.exe | Bin 7680 -> 7168 bytes epics/dbr.py | 33 +- epics/device.py | 18 +- epics/devices/xspress3.py | 5 +- epics/motor.py | 113 ++- epics/pv.py | 585 ++++++++---- epics/utils.py | 6 + epics/wx/motordetailframe.py | 18 +- epics/wx/motorpanel.py | 5 +- epics/wx/ogllib.py | 25 +- epics/wx/utils.py | 27 +- epics/wx/wxlib.py | 36 +- make_wininsts.bat | 10 - publish_docs.sh | 69 -- publish_tarballs.sh | 12 - scripts/Motor_Display.py | 83 +- scripts/mpanel.py | 321 +++++++ setup.py | 21 +- tests/Setup/simulator.py | 4 +- tests/ca_unittest.py | 3 +- tests/pv_unittest.py | 178 +++- tests/test_cas.py | 38 +- tests/test_multiprocessing.py | 4 +- tests/test_pool.py | 7 + tests/test_threading.py | 10 +- upload_wininst.bat | 15 - use_anaconda.bat | 2 - use_py26.bat | 2 - use_py27.bat | 2 - use_py31.bat | 2 - use_py32.bat | 2 - use_py34.bat | 2 - use_py35.bat | 3 - 70 files changed, 2276 insertions(+), 1204 deletions(-) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 epics/clibs/darwin64/README delete mode 100755 epics/clibs/darwin64/libCom.dylib create mode 100755 epics/clibs/darwin64/libComPYEPICS.dylib create mode 100644 epics/clibs/linux32/README delete mode 100644 epics/clibs/linux32/libCom.so create mode 100755 epics/clibs/linux32/libComPYEPICS.so mode change 100644 => 100755 epics/clibs/linux32/libca.so create mode 100644 epics/clibs/linux64/README delete mode 100755 epics/clibs/linux64/libCom.so create mode 100755 epics/clibs/linux64/libComPYEPICS.so create mode 100644 epics/clibs/linuxarm/README create mode 100755 epics/clibs/linuxarm/libComPYEPICS.so create mode 100755 epics/clibs/linuxarm/libca.so create mode 100644 epics/clibs/win32/README create mode 100755 epics/clibs/win32/caRepeater.exe delete mode 100755 epics/clibs/win32/carepeater.exe create mode 100644 epics/clibs/win64/README delete mode 100644 make_wininsts.bat delete mode 100644 publish_docs.sh delete mode 100644 publish_tarballs.sh create mode 100644 scripts/mpanel.py delete mode 100644 upload_wininst.bat delete mode 100644 use_anaconda.bat delete mode 100644 use_py26.bat delete mode 100644 use_py27.bat delete mode 100755 use_py31.bat delete mode 100644 use_py32.bat delete mode 100644 use_py34.bat delete mode 100644 use_py35.bat diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..239b952 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,5 @@ +## Description + + + + diff --git a/.travis.yml b/.travis.yml index c82ac59..afaada3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -53,7 +53,7 @@ before_install: - conda config --add channels lightsource2-tag # MAKE THE CONDA RECIPE - - conda create -n $CONDA_ENV python=$TRAVIS_PYTHON_VERSION epics-base + - conda create -n $CONDA_ENV python=$TRAVIS_PYTHON_VERSION epics-base=3.14.12.6 - source activate $CONDA_ENV install: diff --git a/doc/advanced.rst b/doc/advanced.rst index 0b67b67..90252e8 100644 --- a/doc/advanced.rst +++ b/doc/advanced.rst @@ -13,13 +13,13 @@ pyepics module. The wait and timeout options for get(), ca.get_complete() ============================================================== -The *get* functions, :func:`epics.caget`, :func:`pv.get` and :func:`ca.get` +The *get* functions, :func:`epics.caget`, :func:`pv.get` and :func:`epics.ca.get` all ask for data to be transferred over the network. For large data arrays or slow networks, this can can take a noticeable amount of time. For PVs that have been disconnected, the *get* call will fail to return a value at all. For this reason, these functions all take a `timeout` keyword option. -The lowest level :func:`ca.get` also has a `wait` option, and a companion -function :func:`ca.get_complete`. This section describes the details of +The lowest level :func:`epics.ca.get` also has a `wait` option, and a companion +function :func:`epics.ca.get_complete`. This section describes the details of these. If you're using :func:`epics.caget` or :func:`pv.get` you can supply a @@ -39,32 +39,32 @@ a PV for a large waveform record reports that it is connected, but a At the lowest level (which :func:`pv.get` and :func:`epics.caget` use), -:func:`ca.get` issues a get-request with an internal callback function. +:func:`epics.ca.get` issues a get-request with an internal callback function. That is, it calls the CA library function :func:`libca.ca_array_get_callback` with a pre-defined callback function. -With `wait=True` (the default), :func:`ca.get` then waits up to the timeout +With `wait=True` (the default), :func:`epics.ca.get` then waits up to the timeout or until the CA library calls the specified callback function. If the callback has been called, the value can then be converted and returned. If the callback is not called in time or if `wait=False` is used but the PV is connected, the callback will be called eventually, and simply waiting -(or using :func:`ca.pend_event` if :data:`ca.PREEMPTIVE_CALLBACK` is +(or using :func:`epics.ca.pend_event` if :data:`epics.ca.PREEMPTIVE_CALLBACK` is ``False``) may be sufficient for the data to arrive. Under this condition, -you can call :func:`ca.get_complete`, which will NOT issue a new request +you can call :func:`epics.ca.get_complete`, which will NOT issue a new request for data to be sent, but wait (for up to a timeout time) for the previous get request to complete. -:func:`ca.get_complete` will return ``None`` if the timeout is exceeded or +:func:`epics.ca.get_complete` will return ``None`` if the timeout is exceeded or if there is not an "incomplete get" that it can wait to complete. Thus, -you should use the return value from :func:`ca.get_complete` with care. +you should use the return value from :func:`epics.ca.get_complete` with care. Note that :func:`pv.get` (and so :func:`epics.caget`) will normally rely on the PV value to be filled in automatically by monitor callbacks. If monitor callbacks are disabled (as is done for large arrays and can be turned off) or if the monitor hasn't been called yet, :func:`pv.get` will -check whether it should can :func:`ca.get` or :func:`ca.get_complete`. +check whether it should can :func:`epics.ca.get` or :func:`epics.ca.get_complete`. -If not specified, the timeout for :func:`ca.get_complete` (and all other +If not specified, the timeout for :func:`epics.ca.get_complete` (and all other get functions) will be set to:: timeout = 0.5 + log10(count) @@ -173,19 +173,19 @@ complete version of this looks like this:: The code here probably needs detailed explanation. As mentioned above, it uses the `ca` level, not `PV` objects. Second, the call to -:meth:`ca.create_channel` (Note 1) uses `connect=False` and `auto_cb=False` +:meth:`epics.ca.create_channel` (Note 1) uses `connect=False` and `auto_cb=False` which mean to not wait for a connection before returning, and to not automatically assign a connection callback. Normally, these are not what you want, as you want a connected channel and to be informed if the connection state changes, but we're aiming for maximum speed here. We then -use :meth:`ca.connect_channel` to connect all the channels. Next (Note 2), +use :meth:`epics.ca.connect_channel` to connect all the channels. Next (Note 2), we tell the CA library to request the data for the channel without waiting -around to receive it. The main point of not having :meth:`ca.get` wait for +around to receive it. The main point of not having :meth:`epics.ca.get` wait for the data for each channel as we go is that each data transfer takes time. Instead we request data to be sent in a separate thread for all channels -without waiting. Then we do wait by calling :meth:`ca.poll` once and only +without waiting. Then we do wait by calling :meth:`epics.ca.poll` once and only once, (not `len(pvnamelist)` times!). Finally, we use the -:meth:`ca.get_complete` method to convert the data that has now been +:meth:`epics.ca.get_complete` method to convert the data that has now been received by the companion thread to a python value. Method 2 and 3 have essentially the same runtime, which is somewhat faster @@ -226,8 +226,8 @@ To be clear, it is **connecting** to Epics PVs that is expensive, not the retreiving of data from connected PVs. You can lower the connection expense by not retaining the connection or creating monitors on the PVs, but if you are going to re-use the PVs, that savings will be lost quickly. -In short, use Method 1 over :func:`caget_many` unless you've benchmarked -your use-case and have demonstrated that :func:`caget_many` is better for +In short, use Method 1 over :func:`epics.caget_many` unless you've benchmarked +your use-case and have demonstrated that :func:`epics.caget_many` is better for your needs. .. _advanced-sleep-label: @@ -237,9 +237,9 @@ time.sleep() or epics.poll()? In order for a program to communicate with Epics devices, it needs to allow some time for this communication to happen. With -:data:`ca.PREEMPTIVE_CALLBACK` set to ``True``, this communication will +:data:`epics.ca.PREEMPTIVE_CALLBACK` set to ``True``, this communication will be handled in a thread separate from the main Python thread. This means -that CA events can happen at any time, and :meth:`ca.pend_event` does not +that CA events can happen at any time, and :meth:`epics.ca.pend_event` does not need to be called to explicitly allow for event processing. Still, some time must be released from the main Python thread on occasion @@ -252,8 +252,8 @@ in order for events to be processed. The simplest way to do this is with Unfortunately, the :meth:`time.sleep` method is not a very high-resolution clock, with typical resolutions of 1 to 10 ms, depending on the system. Thus, even though events will be asynchronously generated and epics with -pre-emptive callbacks does not *require* :meth:`ca.pend_event` or -:meth:`ca.poll` to be run, better performance may be achieved with an event +pre-emptive callbacks does not *require* :meth:`epics.ca.pend_event` or +:meth:`epics.ca.poll` to be run, better performance may be achieved with an event loop of:: >>> while True: @@ -283,7 +283,7 @@ value, but if :data:`epics.ca.PREEMPTIVE_CALLBACK` has been set to ``False``, threading will not work. Second, if you are using :class:`PV` objects and not making heavy use of -the :mod:`ca` module (that is, not making and passing around chids), then +the :mod:`epics.ca` module (that is, not making and passing around chids), then the complications below are mostly hidden from you. If you're writing threaded code, it's probably a good idea to read this just to understand what the issues are. @@ -295,12 +295,12 @@ The Channel Access library uses a concept of *contexts* for its own thread model, with contexts holding sets of threads as well as Channels and Process Variables. For non-threaded work, a process will use a single context that is initialized prior doing any real CA work (done in -:meth:`ca.initialize_libca`). In a threaded application, each new thread +:meth:`epics.ca.initialize_libca`). In a threaded application, each new thread begins with a new, uninitialized context that must be initialized or replaced. Thus each new python thread that will interact with CA must -either explicitly create its own context with :meth:`ca.create_context` +either explicitly create its own context with :meth:`epics.ca.create_context` (and then, being a good citizen, destroy this context as the thread ends -with :meth:`ca.destroy_context`) or attach to an existing context. +with :meth:`epics.ca.destroy_context`) or attach to an existing context. The generally recommended approach is to use a single CA context throughout an entire process and have each thread attach to the first context created @@ -332,7 +332,7 @@ you are writing a threaded application in which the first real CA calls are inside a child thread, it is recommended that you initialize CA in the main thread, -As a convenience, the :class:`CAThread` in the :mod:`ca` module is +As a convenience, the :class:`CAThread` in the :mod:`epics.ca` module is is a very thin wrapper around the standard :class:`threading.Thread` which adding a call of :meth:`epics.ca.use_initial_context` just before your threaded function is run. This allows your target functions to not diff --git a/doc/arrays.rst b/doc/arrays.rst index 3e756a1..a8736e8 100644 --- a/doc/arrays.rst +++ b/doc/arrays.rst @@ -15,7 +15,7 @@ Arrays without Numpy ~~~~~~~~~~~~~~~~~~~~~~~~ If you have numpy installed, and use the default *as_numpy=True* in -:meth:`ca.get`, :meth:`pv.get` or :meth:`epics.caget`, you will get a +:meth:`epics.ca.get`, :meth:`pv.get` or :meth:`epics.caget`, you will get a numpy array for the value of a waveform PV. If you do *not* have numpy installed, or explicitly use *as_numpy=False* in a get request, you will get the raw C-like array reference from the Python @@ -38,7 +38,7 @@ Variable Length Arrays: NORD and NELM ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ While the maximum length of an array is fixed, the length of data you get -back from a monitor, :meth:`ca.get`, :meth:`pv.get`, or :meth:`epics.caget` +back from a monitor, :meth:`epics.ca.get`, :meth:`pv.get`, or :meth:`epics.caget` may be shorter than the maximum length, reflecting the most recent data put to that PV. That is, if some process puts a smaller array to a PV than its maximum length, monitors on that PV may receive only the changed data. @@ -56,9 +56,8 @@ For example:: To be clear, the :meth:`pv.put` above could be done in a separate process -- the :meth:`pv.get` is not using a value cached from the :meth:`pv.put`. -This feature seems to depend on the record definition, and requires version -3.14.12.1 of Epics base or higher, and can be checked by comparing -:meth:`ca.version` with the string '4.13'. +This feature was introduced in Epics CA 3.14.12.1, and may not work for +data from IOCs running extremely old versions of Epics base. Character Arrays ~~~~~~~~~~~~~~~~~~~~~~~~ @@ -66,8 +65,8 @@ Character Arrays As noted in other sections, character waveforms can be used to hold strings longer than 40 characters, which is otherwise a fundamental limit for native Epics strings. Character waveforms shorter than -:data:`ca.AUTOMONITOR_MAXLENGTH` can be turned into strings with an -optional *as_string=True* to :meth:`ca.get`, :meth:`pv.get` , or +:data:`epics.ca.AUTOMONITOR_MAXLENGTH` can be turned into strings with an +optional *as_string=True* to :meth:`epics.ca.get`, :meth:`pv.get` , or :meth:`epics.caget`. If you've defined a Epics waveform record as:: @@ -94,7 +93,7 @@ Then you can use this record with: >>> print char_val 'T:\\xas_user\\March2010\\FastMap' -This example uses :meth:`pv.get` but :meth:`ca.get` is essentially +This example uses :meth:`pv.get` but :meth:`epics.ca.get` is essentially equivalent, as its *as_string* parameter works exactly the same way. Note that Epics character waveforms as defined as above are really arrays @@ -145,13 +144,13 @@ assured that the latest value is always available. As arrays get larger automatic monitoring is desirable. The Python :mod:`epics.ca` module defines a variable -:data:`ca.AUTOMONITOR_MAXLENGTH` which controls whether array PVs are +:data:`epics.ca.AUTOMONITOR_MAXLENGTH` which controls whether array PVs are automatically monitored. The default value for this variable is 65536, but can be changed at runtime. Arrays with fewer elements than -:data:`ca.AUTOMONITOR_MAXLENGTH` will be automatically monitored, unless -explicitly set, and arrays larger than :data:`AUTOMONITOR_MAXLENGTH` will -not be automatically monitored unless explicitly set. Auto-monitoring of -PVs can be be explicitly set with +:data:`epics.ca.AUTOMONITOR_MAXLENGTH` will be automatically monitored, +unless explicitly set, and arrays larger than +:data:`epics.ca.AUTOMONITOR_MAXLENGTH` will not be automatically monitored +unless explicitly set. Auto-monitoring of PVs can be be explicitly set with >>> pv2 = epics.PV('ScalerPV', auto_monitor=True) >>> pv1 = epics.PV('LargeArrayPV', auto_monitor=False) @@ -162,9 +161,10 @@ Example handling Large Arrays Here is an example reading data from an `EPICS areaDetector `_, as if it -were an image from a digital camera. This uses the `Python Imaging Library -`_ for much of the image -processing: +were an image from a digital camera. This uses the common third-party +library called `Python Imaging Library` or `pillow` for much of the image +processing. This library can be installed with `pip install pillow` or +`conda install pillow`: >>> import epics diff --git a/doc/ca.rst b/doc/ca.rst index 29079c4..c2aacfb 100644 --- a/doc/ca.rst +++ b/doc/ca.rst @@ -2,33 +2,27 @@ ca: Low-level Channel Access module ================================================= -.. module:: ca - :synopsis: low-level Channel Access module. - .. module:: epics.ca :synopsis: low-level Channel Access module. -The :mod:`ca` module provides a low-level wrapping of the EPICS -Channel Access (CA) library, using ctypes. Most users of the `epics` -module will not need to be concerned with most of the details here, and -will instead use the simple functional interface (:func:`epics.caget`, -:func:`epics.caput` and so on), or use the :class:`epics.PV` class to -create and use epics PV objects. + +The :mod:`ca` module provides a low-level wrapping of the EPICS Channel Access +(CA) library, using ctypes. Most users of the `epics` module will not need to +be concerned with most of the details here, and will instead use the simple +procedural interface (:func:`epics.caget`, :func:`epics.caput` and so on), or +use the :class:`epics.PV` class to create and use epics PV objects. General description, difference with C library ================================================= -The goal of the :mod:`ca` module is to provide a fairly complete -mapping of the C interface to the CA library while also providing a -pleasant Python experience. It is expected that anyone looking -into the details of this module is somewhat familiar with Channel -Access and knows where to consult the `Channel Access Reference -Documentation -`_. -This document focuses on the differences with the C interface, -assuming a general understanding of what the functions are meant to -do. +The :mod:`ca` module provides a fairly complete mapping of the C interface to +the CA library while also providing a pleasant Python experience. It is +expected that anyone using this module is somewhat familiar with Channel +Access and knows where to consult the `Channel Access Reference Documentation +`_. Here, we focus on the +differences with the C interface, and assume a general understanding of what +the functions are meant to do. Name Mangling @@ -146,15 +140,19 @@ Using the CA module Many general-purpose CA functions that deal with general communication and threading contexts are very close to the C library: -.. autofunction:: initialize_libca +.. autofunction:: initialize_libca() -.. autofunction:: finalize_libca +.. autofunction:: finalize_libca() + +.. autofunction:: pend_io(timeout=1.0) + +.. autofunction:: pend_event(timeout=1.e-5) + +.. autofunction:: poll(evt=1.e-5[, iot=1.0]) -.. function:: context_create() -.. autofunction:: create_context +.. autofunction:: create_context() -.. function:: context_destroy() -.. autofunction:: destroy_context +.. autofunction:: destroy_context() .. autofunction:: current_context() @@ -174,11 +172,15 @@ threading contexts are very close to the C library: .. autofunction:: replace_printf_handler(fcn=None) -.. autofunction:: pend_io(timeout=1.0) +.. warning:: -.. autofunction:: pend_event(timeout=1.e-5) + `replace_printf_handler()` appears to not actually work. + + We think this is due to a real limitation of Python's `ctypes` module + not supporting the mapping of C *va_list* function arguments to Python. + If you are interested in this or have ideas of how to fix it, please + let us know. -.. autofunction:: poll(evt=1.e-5[, iot=1.0]) Creating and Connecting to Channels @@ -194,7 +196,6 @@ a good idea to treat these as object instances. .. autofunction:: connect_channel(chid, timeout=None, verbose=False) - Many other functions require a valid Channel ID, but not necessarily a connected Channel. These functions are essentially identical to the CA library versions, and include: @@ -213,7 +214,7 @@ library versions, and include: .. autofunction:: field_type(chid) - See the *ftype* column from :ref:`Table of DBR Types `. +See the *ftype* column from :ref:`Table of DBR Types `. .. autofunction:: clear_channel(chid) @@ -228,7 +229,7 @@ A few additional pythonic functions have been added: .. autofunction:: promote_type(chid, [use_time=False, [use_ctrl=False]]) - See :ref:`Table of DBR Types `. +See :ref:`Table of DBR Types `. .. data:: _cache @@ -259,34 +260,29 @@ keyword arguments can be used to specify such options. .. autofunction:: get(chid, ftype=None, count=None, as_string=False, as_numpy=True, wait=True, timeout=None) - - See :ref:`Table of DBR Types ` for a listing of values of - *ftype*, - +See :ref:`Table of DBR Types ` for a listing of values of *ftype*, - See :ref:`arrays-large-label` for a discussion of strategies - for how to best deal with very large arrays. +See :ref:`arrays-large-label` for a discussion of strategies for how to best deal with very large arrays. +See :ref:`advanced-connecting-many-label` for a discussion of when using `wait=False` can give a large performance boost. - See :ref:`advanced-connecting-many-label` for a discussion of when using - `wait=False` can give a large performance boost. - - See :ref:`advanced-get-timeouts-label` for further discussion of the - *wait* and *timeout* options and the associated :func:`get_complete` - function. +See :ref:`advanced-get-timeouts-label` for further discussion of the *wait* and *timeout* options and the associated :func:`get_complete` function. +.. autofunction:: get_with_metadata(chid, ftype=None, count=None, as_string=False, as_numpy=True, wait=True, timeout=None) .. autofunction:: get_complete(chid, ftype=None, count=None, as_string=False, as_numpy=True, timeout=None) - See :ref:`advanced-get-timeouts-label` for further discussion. +See :ref:`advanced-get-timeouts-label` for further discussion. + +.. autofunction:: get_complete_with_metadata(chid, ftype=None, count=None, as_string=False, as_numpy=True, timeout=None) .. autofunction:: put(chid, value, wait=False, timeout=30, callback=None, callback_data=None) - For more on this *put callback*, see :ref:`ca-callbacks-label` below. +See :ref:`ca-callbacks-label` for more on this *put callback*, .. autofunction:: create_subscription(chid, use_time=False, use_ctrl=False, mask=None, callback=None) - For more on writing the user-supplied callback, see :ref:`ca-callbacks-label` below. +See :ref:`ca-callbacks-label` for more on writing the user-supplied callback, .. warning:: @@ -325,17 +321,17 @@ keyword arguments can be used to specify such options. Several other functions are provided: -.. autofunction:: get_timestamp(chid) +.. autofunction:: get_timestamp(chid) -.. autofunction:: get_severity(chid) +.. autofunction:: get_severity(chid) -.. autofunction:: get_precision(chid) +.. autofunction:: get_precision(chid) .. autofunction:: get_enum_strings(chid) .. autofunction:: get_ctrlvars(chid) - See :ref:`Table of Control Attributes ` +See :ref:`Table of Control Attributes ` .. _ctrlvars_table: @@ -370,9 +366,17 @@ states. Synchronous Groups ~~~~~~~~~~~~~~~~~~~~~~~ -Synchronous Groups can be used to ensure that a set of Channel Access calls -all happen together, as if in a *transaction*. Synchronous Groups work in -PyEpics as of version 3.0.10, but more testing is probably needed. +.. warning:: + + Synchronous groups are simulated in pyepics, but are not recommended, + and probably don't really make sense for usage within pyepics and using + asynchronous i/o anyway. + +Synchronous Groups are can be used to ensure that a set of Channel Access +calls all happen together, as if in a *transaction*. Synchronous Groups +should be avoided in pyepics, and are not well tested. They probably make +little sens in the context of asynchronous I/O. The documentation here is +given for historical purposes. The idea is to first create a synchronous group, then add a series of :func:`sg_put` and :func:`sg_get` which do not happen immediately, and @@ -389,55 +393,12 @@ and :func:`sg_get` to execute. .. autofunction:: sg_get(gid, chid[, ftype=None[, as_string=False[, as_numpy=True]]]) - See further example below. - .. autofunction:: sg_put(gid, chid, value) .. autofunction:: sg_test(gid) .. autofunction:: sg_reset(gid) -An example use of a synchronous group:: - - from epics import ca - import time - - pvs = ('X1.VAL', 'X2.VAL', 'X3.VAL') - chids = [ca.create_channel(pvname) for pvname in pvs] - - for chid in chids: - ca.connect_channel(chid) - ca.put(chid, 0) - - # create synchronous group - sg = ca.sg_create() - - # get data pointers from ca.sg_get - data = [ca.sg_get(sg, chid) for chid in chids] - - print 'Now change these PVs for the next 10 seconds' - time.sleep(10.0) - - print 'will now block for i/o' - ca.sg_block(sg) - # - # CALL ca._unpack with data points and chid to extract data - for pvname, dat, chid in zip(pvs, data, chids): - val = ca._unpack(dat, chid=chid) - print "%s = %s" % (pvname, str(val)) - - ca.sg_reset(sg) - - # Now a SG Put - print 'OK, now we will put everything back to 0 synchronously' - - for chid in chids: - ca.sg_put(sg, chid, 0) - - print 'sg_put done, but not blocked / committed. Sleep for 5 seconds ' - time.sleep(5.0) - ca.sg_block(sg) - print 'done.' .. _ca-implementation-label: @@ -512,7 +473,7 @@ used heavily inside of ca.py or are available for your convenience. .. autofunction:: withInitialContext(fcn) - See :ref:`advanced-threads-label` for further discussion. +See :ref:`advanced-threads-label` for further discussion. Unpacking Data from Callbacks @@ -563,7 +524,7 @@ pairs that will include: * `value`: the latest value * `count`: the number of data elements * `ftype`: the numerical CA type indicating the data type - * `status`: the status of the PV (1 for OK) + * `status`: the status of the PV (0 for OK) * `chid`: the integer address for the channel ID. For access rights event callbacks, your function will be passed: @@ -767,7 +728,7 @@ called immediately after successful installation:: import epics import time - + def on_access_rights_change(read_access, write_access): print 'read access = %s, write access = %s' % (read_access, write_access) diff --git a/doc/index.rst b/doc/index.rst index f518605..20472dc 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -5,31 +5,29 @@ Epics Channel Access for Python PyEpics is an interface for the Channel Access (CA) library of the `Epics Control System `_ to the Python Programming -language. The pyepics package provides a base :mod:`epics` module to -python, with methods for reading from and writing to Epics Process -Variables (PVs) via the CA protocol. The package includes a fairly -complete, thin layer over the low-level Channel Access library in the -:mod:`ca` module, and higher-level abstractions built on top of this basic -functionality. - -The package includes a simple, functional approach to CA similar to EZCA -and the Unix command-line tools with functions in the main :mod:`epics` -package including :meth:`epics.caget`, :meth:`epics.caput`, -:meth:`epics.cainfo`, and :meth:`epics.camonitor`. There is also a -:class:`pv.PV` object which represents an Epics Process Variable as an -easy-to-use Python object. Additional modules provide even higher-level -programming support to Epics. These include groups of related PVs in -:class:`device.Device`, a simple method to create alarms in -:class:`alarm.Alarm`, and support for saving PVs values in the -:mod:`autosave` module. Finally, there is support for conveniently -tying epics PVs to wxPython widgets in the :mod:`wx` module. +language. The pyepics package provides a base :mod:`epics` module to python, +with methods for reading from and writing to Epics Process Variables (PVs) via +the CA protocol. The package includes a thin and fairly complete layer over +the low-level Channel Access library in the :mod:`ca` module, and higher level +abstractions built on top of this basic functionality. + +The package includes a very simple interface to CA similar to the Unix +command-line tools and EZCA library with functions :meth:`epics.caget`, +:meth:`epics.caput`, :meth:`epics.cainfo`, and :meth:`epics.camonitor`. +For an object-oriented interface, there is also a :class:`pv.PV` class +which represents an Epics Process Variable as a full-featured and +easy-to-use Python object. Additional modules provide higher-level +programming support to CA, including grouping related PVs into a +:class:`device.Device`, creating alarms in :class:`alarm.Alarm`, and saving +PVs values in the :mod:`autosave` module. There is also support for +conveniently using epics PVs to wxPython widgets in the :mod:`wx` module, +and some support for using PyQt widgets in the :mod:`qt` module. ----------- In addition to the Pyepics library described here, several applications built with pyepics are available at `http://github.com/pyepics/epicsapps/ -`_. -See +`_. See `http://pyepics.github.com/epicsapps/ `_ for further details. @@ -48,4 +46,3 @@ See autosave wx advanced - diff --git a/doc/installation.rst b/doc/installation.rst index 0db4e0d..9a8c342 100644 --- a/doc/installation.rst +++ b/doc/installation.rst @@ -6,28 +6,30 @@ Downloading and Installation Prerequisites ~~~~~~~~~~~~~~~ -PyEpics works with Python version 2.7, 3.5, or 3.6. It is supported and -regularly used and tested on 64-bit Linux, 64-bit Mac OSX, 64-bit Windows, -and 32-bit Windows. It should still work on 32-bit Linux, and may work with -older versions of Python, but these are rarely tested. For Windows, use of -pyepics with IronPython (Python written with .NET) has been recently -reported, but is not routinely tested. - -The EPICS Channel Access library Version 3.14 or higher is required for -pyepics to actually communicate with Epics variables. Specifically, the -shared libraries libca and libCom (*libca.so* and *libCom.so* on Linux, -*libca.dylib* and *libCom.dylib* on Mac OSX, or *ca.dll* and *Com.dll* on -Windows) from *Epics Base* are required to use this module. Some features, -including 'subarray records' will only work with version 3.14.12 and -higher, and version 3.15 or higher is recommended. - -For all supported operating systems, pre-built and recent versions of libca -and libCom are provided, and will be installed within the python packages -directory and used by default. Though they will be found by default by -pyepics, these libraries will be hard for other applications to find, and -so should not cause conflicts with other CA client programs. We regularly -test with these libraries and recommend using them. If you want to not use -them or even install them, instructions for how to do this are given below. +PyEpics works with Python version 2.7, 3.5, 3.6, and 3.7. It is supported +and regularly used and tested on 64-bit Linux, 64-bit Mac OSX, and 64-bit +Windows. It is known to work on Linux with ARM processors including +raspberry Pi, though this is not part of the automated testing set. +Pyepics may still work on 32-bit Windows and Linux, but these systems are +not tested regularly. It may also work with older versions of Python (such +as 3.4), but these are no longer tested or supported. For Windows, pyepics +has been reported to work with IronPython (that is, Python written in the +.NET framework), but this is not routinely tested. + +The EPICS Channel Access library Version 3.14.12 or higher is required for +pyepics and 3.15 or higher are strongly recommended. More specifically, +pyepics requires e shared libraries libca and libCom (*libca.so* and +*libCom.so* on Linux, *libca.dylib* and *libCom.dylib* on Mac OSX, or +*ca.dll* and *Com.dll* on Windows) from *Epics Base*. + +For all supported operating systems and some less-well-tested systems (all +of linux-64, linux-32,linux-arm, windows-64, windows-32, and darwin-64), +pre-built versions of *libca* (and *libCom*) built with 3.16.2 are +provided, and will be installed within the python packages directory and +used by default. This means that you do not need to install Epics base +libraries or any other packages to use pyepics. For Epics experts who may +want to use their own versions the *libca* from Epics base, instructions +for how to do this are given below. The Python `numpy module `_ is highly recommended, though it is not required. If available, it will be used @@ -49,14 +51,13 @@ Downloads and Installation The latest stable version of the pyepics package is |release|. Source code -kits and Windows installers can be found at `pyepics PyPI`_. With `Python -Setup Tools`_ now standard for Python 2.7 and above, the simplest way to -install the pyepics is with:: +kits and Windows installers can be found at `pyepics PyPI`_, and can be +installed with:: pip install pyepics -If you're using Anaconda Python, there are a few conda channels for -pyepics, including:: +If you're using Anaconda Python, there are a few conda channels for pyepics, +including:: conda install -c GSECARS pyepics @@ -64,41 +65,32 @@ You can also download the source package, unpack it, and install with:: python setup.py install -If you are certain that you will not want to use the default version of -*libca* that pyepics provides and is tested with, you can suppress the -installation of the default versions by setting the environmental variable -`NOLIBCA` at install time, as with:: - - NOLIBCA=1 python setup.py install - -or:: - - NOLIBCA=1 pip install pyepics - -Note that this should be considered an expert-level option. - Getting Started, Setting up the Epics Environment ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ As mentioned above, pyepics must be able to find and load the Channel Access dynamic library (*libca.so*, *libca.dylib*, or *ca.dll* depending on -the system) at runtime in order to actually work. By default, the provided -versions of these libraries will be installed and used. +the system) at runtime in order to actually work. For the most commonly +used operating systems and architectures, modern version of these libraries +are provided, and will be installed and used with pyepics. We strongly +recommend using these. -If you wish to use a different version of *libca*, there are a few ways to -specify how that will be found. First, you can set the environmental -variable ``PYEPICS_LIBCA`` to the full path of the dynamic library, for -example:: +If these provided versions of *libca* do not work for you, please let us know. +If you need to or wish to use a different version of *libca*, you can set the +environmental variable ``PYEPICS_LIBCA`` to the full path of the dynamic +library to use as *libca*, for example:: > export PYEPICS_LIBCA=/usr/local/epics/base-3.15.5/lib/linux-x86_64/libca.so -For experts who want to never use the default version, installation of -*libca* (and *libCom*) can be turned off by setting the environmental -variable `NOLIBCA` at install time, as shown above. If you do this, you -will want to make sure that *libca.so* can be found in your `PATH` -environmental variable, or in `LD_LIBRARY_PATH` or `DYLD_LIBRARY_PATH` on -Mac OSX. +Note that *libca* will need to find another Epics CA library *libCom*. This +is almost always in the same folder as *libca*, but you may need to make sure +that the *libca* you are pointing to can find the required *libCom*. The +methods for telling shared libraries (or executable files) how to find other +shared libraries varies with system, but you may need to set other +environmental variables such as ``LD_LIBRARY_PATH`` or ``DYLIB_LIBRARY_PATH`` +or use `ldconfig`. If you're having trouble with any of these things, +ask your local Epics gurus or contact the authors. To find out which CA library will be used by pyepics, use: >>> import epics @@ -110,9 +102,9 @@ With the Epics library loaded, you will need to be able to connect to Epics Process Variables. Generally, these variables are provided by Epics I/O controllers (IOCs) that are processes running on some device on the network. If you are connecting to PVs provided by IOCs on your local -subnet, you should have no trouble. If trying to reach further network, -you may need to set the environmental variable ``EPICS_CA_ADDR_LIST`` to -specify which networks to search for PVs. +subnet, you should have no trouble. If trying to reach IOCs outside of +your immediate subnet, you may need to set the environmental variable +``EPICS_CA_ADDR_LIST`` to specify which networks to search for PVs. Testing @@ -131,14 +123,11 @@ Development Version ~~~~~~~~~~~~~~~~~~~~~~~~ Development of pyepics is done through the `pyepics github -repository`_. To get a read-only copy of the latest version, use one -of:: +repository`_. To get a copy of the latest version do:: - git clone http://github.com/pyepics/pyepics.git git clone git@github.com/pyepics/pyepics.git - Getting Help ~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/doc/overview.rst b/doc/overview.rst index b0a5a2a..a03bd06 100644 --- a/doc/overview.rst +++ b/doc/overview.rst @@ -35,12 +35,12 @@ Channel Access, the :func:`caget` and :func:`caput` functions are probably where you want to start. If you're building larger scripts and programs, using :class:`PV` objects -provided by the :mod:`pv` module is recommended. The :class:`PV` class -provides a Process Variable (PV) object that has both methods (including -:meth:`get` and :meth:`put`) to read and change the PV, and attributes that -are kept automatically synchronized with the remote channel. For larger -applications where you find yourself working with sets of related PVs, you -may find the :class:`Device` class helpful. +is recommended. The :class:`PV` class provides a Process Variable (PV) +object that has methods (including :meth:`get` and :meth:`put`) to read and +change the PV, and attributes that are kept automatically synchronized with +the remote channel. For larger applications where you find yourself +working with sets of related PVs, you may find the :class:`Device` class +helpful. The lowest-level CA functionality is exposed in the :mod:`ca` module, and companion :mod:`dbr` module. While not necessary recommended for most use @@ -65,7 +65,7 @@ You'll then be able to use Python's introspection tools and built-in help system, and the rest of this document as a reference and for detailed discussions. -Functional Approach: caget(), caput() +Procedural Approach: caget(), caput() ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To get values from PVs, you can use the :func:`caget` function: @@ -112,9 +112,7 @@ function: ============================= The simplicity and clarity of these functions make them ideal for many -cases. - - +uses. Creating and Using PV Objects ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -154,7 +152,7 @@ printing it: >>> print(pv1) -Even more complete information can be seen by printing the PVs :attr:`info` +More complete information can be seen by printing the PVs :attr:`info` attribute:: >>> print(pv1.info) diff --git a/doc/pv.rst b/doc/pv.rst index 73640ca..2ae9ca5 100644 --- a/doc/pv.rst +++ b/doc/pv.rst @@ -85,7 +85,7 @@ callbacks to be executed when the PV changes. .. _pv-get-label: -.. method:: get([, count=None[, as_string=False[, as_numpy=True[, timeout=None[, use_monitor=True]]]]]) +.. method:: get([, count=None[, as_string=False[, as_numpy=True[, timeout=None[, use_monitor=True, [with_ctrlvars=False]]]]]]) get and return the current value of the PV @@ -120,11 +120,47 @@ callbacks to be executed when the PV changes. automatically monitored. Otherwise, the most recently received value will be sent immediately. + The *with_ctrlvars* option requests DBR_CTRL data, including control limits, + precision, and so on, in addition to the value normally returned. This metadata + will be available by accessing various attributes such as + ``lower_ctrl_limit``. + See :ref:`pv-automonitor-label` for more on monitoring PVs and :ref:`advanced-get-timeouts-label` for more details on what happens when a :func:`pv.get` times out. +.. method:: get_with_metadata([, form=None, [count=None[, as_string=False[, as_numpy=True[, timeout=None[, use_monitor=True, [with_ctrlvars=False]]]]]]]) + + Returns a dictionary of the current value and associated metadata + + :param form: EPICS *data type* to request: the 'native', or the 'ctrl' (Control) or 'time' variant. Defaults to the PV instance attribute ``form``. + :type form: {'native', 'time', 'ctrl', None} + :param count: maximum number of array elements to return + :type count: integer or ``None`` + :param as_string: whether to return the string representation of the value. + :type as_string: ``True``/``False`` + :param as_numpy: whether to try to return a numpy array where appropriate. + :type as_string: ``True``/``False`` + :param timeout: maximum time to wait for data before returning ``None``. + :type timeout: float or ``None`` + :param use_monitor: whether to rely on monitor callbacks or explicitly get value now. + :type use_monitor: ``True``/``False`` + + See ``PV.get``, above, for further notes on each of these parameters. + + Each request to EPICS can optionally contain additional metadata associated + with the value. While ``PV.get`` updates the PV instance with any metadata, + ``get_with_metadata`` will return the requested metadata and value in a + dictionary. + + The exception is when the PV is set to auto-monitor and the `use_monitor` + parameter here is set. This means that both the value and metadata will + used the cached values instead of making a new request. Because of this, + the metadata and value returned here will be a full dictionary of all known + metadata for the PV instance. + + .. method:: put(value[, wait=False[, timeout=30.0[, use_complete=False[, callback=None[, callback_data=None]]]]]) set the PV value, optionally waiting to return until processing has @@ -161,11 +197,11 @@ completed. See :ref:`pv-putwait-label` for more details. .. method:: poll([evt=1.e-4, [iot=1.0]]) - poll for changes. This simply calls :meth:`ca.poll` + poll for changes. This simply calls :meth:`epics.ca.poll` - :param evt: time to pass to :meth:`ca.pend_event` + :param evt: time to pass to :meth:`epics.ca.pend_event` :type evt: float - :param iot: time to pass to :meth:`ca.pend_io` + :param iot: time to pass to :meth:`epics.ca.pend_io` :type iot: float .. method:: connect([timeout=None]) @@ -174,12 +210,12 @@ completed. See :ref:`pv-putwait-label` for more details. successfully connected. It is probably not that useful, as connection should happen automatically. See :meth:`wait_for_connection`. - :param timeout: maximum connection time, passed to :meth:`ca.connect_channel` + :param timeout: maximum connection time, passed to :meth:`epics.ca.connect_channel` :type timeout: float :rtype: ``True``/``False`` if timeout is ``None``, the PVs connection_timeout parameter will be used. If that is also ``None``, - :data:`ca.DEFAULT_CONNECTION_TIMEOUT` will be used. + :data:`episc.ca.DEFAULT_CONNECTION_TIMEOUT` will be used. .. method:: wait_for_connection([timeout=None]) @@ -191,7 +227,7 @@ completed. See :ref:`pv-putwait-label` for more details. :rtype: ``True``/``False`` if timeout is ``None``, the PVs connection_timeout parameter will be used. If that is also ``None``, - :data:`ca.DEFAULT_CONNECTION_TIMEOUT` will be used. + :data:`epics.ca.DEFAULT_CONNECTION_TIMEOUT` will be used. .. method:: disconnect() @@ -205,7 +241,7 @@ completed. See :ref:`pv-putwait-label` for more details. turn off automatic monitoring of a PV. Note that this will suspend all event callbacks on a PV at the CA level by calling - :func:`ca.clear_subscription`, but will not clear the list of PVs + :func:`epics.ca.clear_subscription`, but will not clear the list of PVs callbacks. This means that doing :meth:`reconnect` will resume event processing including any callbacks or the PV. @@ -301,7 +337,7 @@ assigned to. The exception to this rule is the :attr:`value` attribute. .. attribute:: status - The PV status, which will be 1 for a Normal, connected PV. + The PV status, which will be 0 for a normal, connected PV. .. attribute:: type @@ -449,7 +485,7 @@ String representation for a PV ================================ The string representation for a `PV`, as returned either with the -*as_string* argument to :meth:`ca.get` or from the :attr:`char_value` +*as_string* argument to :meth:`epics.ca.get` or from the :attr:`char_value` attribute (they are equivalent) needs some further explanation. The value of the string representation (hereafter, the :attr:`char_value`), @@ -510,7 +546,7 @@ Possible values for :attr:`auto_monitor` are: ``None`` The default value for *auto_monitor* is ``None``, and is set to ``True`` if the element count for the PV is smaller than - :data:`ca.AUTOMONITOR_MAXLENGTH` (default of 65536). To suppress + :data:`epics.ca.AUTOMONITOR_MAXLENGTH` (default of 65536). To suppress monitoring of PVs with fewer array values, you will have to explicitly turn *auto_monitor* to ``False``. For waveform arrays with more elements, automatic monitoring will not be done unless you explicitly set @@ -519,7 +555,7 @@ Possible values for :attr:`auto_monitor` are: ``True`` When *auto_monitor* is set to ``True``, the value will be monitored using - the default subscription mask set at :data:`ca.DEFAULT_SUBSCRIPTION_MASK`. + the default subscription mask set at :data:`epics.ca.DEFAULT_SUBSCRIPTION_MASK`. This mask determines which kinds of changes cause the PV to update. By default, the subscription updates when the PV value changes by more @@ -530,7 +566,7 @@ Possible values for :attr:`auto_monitor` are: It is also possible to request an explicit type of CA subscription by setting *auto_monitor* to a numeric subscription mask made up of dbr.DBE_ALARM, dbr.DBE_LOG and/or dbr.DBE_VALUE. This mask will be - passed directly to :meth:`ca.create_subscription` An example would be:: + passed directly to :meth:`epics.ca.create_subscription` An example would be:: pv1 = PV('AAA', auto_monitor=dbr.DBE_VALUE) pv2 = PV('BBB', auto_monitor=dbr.DBE_VALUE|dbr.DBE_ALARM) @@ -579,7 +615,7 @@ following keyword parameters: * `count`: the number of data elements * `ftype`: the numerical CA type indicating the data type * `type`: the python type for the data - * `status`: the status of the PV (1 for OK) + * `status`: the status of the PV (0 for OK) * `precision`: number of decimal places of precision for floating point values * `units`: string for PV units * `severity`: PV severity @@ -801,6 +837,41 @@ or, equivalently >>> print p1.char_value '1.000' +Requests including Metadata +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +It is also possible to get the metadata associated with a single Channel Access +request using :func:`get_with_metadata`:: + + >>> from epics import PV + >>> p1 = PV('xxx.VAL', form='time') + + >>> print(p1.get()) + 1.00 + + >>> p1.get_with_metadata() + {'status': 0, + 'severity': 0, + 'timestamp': 1543429156.811018, + 'posixseconds': 1543429156.0, + 'nanoseconds': 811018603, + 'value': 1.0} + + >>> print(p1.get_with_metadata(form='ctrl')) + {'upper_disp_limit': 100.0, + 'lower_disp_limit': -100.0, + 'upper_alarm_limit': 0.0, + 'upper_warning_limit': 0.0, + 'lower_warning_limit': 0.0, + 'lower_alarm_limit': 0.0, + 'upper_ctrl_limit': 100.0, + 'lower_ctrl_limit': -100.0, + 'precision': 3, + 'units': 'deg', + 'status': 0, + 'severity': 0, + 'value': 1.0} + Example of using info and more properties examples ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/epics/__init__.py b/epics/__init__.py index 0d57c08..0eeac45 100644 --- a/epics/__init__.py +++ b/epics/__init__.py @@ -61,13 +61,16 @@ def caput(pvname, value, wait=False, timeout=60): to wait for pv to complete processing, use 'wait=True': >>> caput('xx.VAL',3.0,wait=True) """ - thispv = get_pv(pvname, connect=True) + start_time = time.time() + thispv = get_pv(pvname, timeout=timeout, connect=True) if thispv.connected: + timeout -= (time.time() - start_time) return thispv.put(value, wait=wait, timeout=timeout) def caget(pvname, as_string=False, count=None, as_numpy=True, use_monitor=False, timeout=5.0): - """caget(pvname, as_string=False) + """caget(pvname, as_string=False,count=None,as_numpy=True, + use_monitor=False,timeout=5.0) simple get of a pv's value.. >>> x = caget('xx.VAL') @@ -92,8 +95,8 @@ def caget(pvname, as_string=False, count=None, as_numpy=True, poll() return val -def cainfo(pvname, print_out=True): - """cainfo(pvname,print_out=True) +def cainfo(pvname, print_out=True, timeout=5.0): + """cainfo(pvname,print_out=True,timeout=5.0) return printable information about pv >>>cainfo('xx.VAL') @@ -103,10 +106,13 @@ def cainfo(pvname, print_out=True): If print_out=False, the status report will be printed, and not returned. """ - thispv = get_pv(pvname, connect=True) + start_time = time.time() + thispv = get_pv(pvname, timeout=timeout, connect=True) if thispv.connected: - thispv.get() - thispv.get_ctrlvars() + conn_time = time.time() - start_time + thispv.get(timeout=timeout-conn_time) + get_time = time.time() - start_time + thispv.get_ctrlvars(timeout=timeout-get_time) if print_out: ca.write(thispv.info) else: @@ -152,27 +158,56 @@ def callback(pvname=None, value=None, char_value=None, **kwds): thispv.add_callback(callback, index=-999, with_ctrlvars=True) _PVmonitors_[pvname] = thispv -def caget_many(pvlist, as_string=False, count=None, as_numpy=True, timeout=5.0): - """get values for a list of PVs - This does not maintain PV objects, and works as fast - as possible to fetch many values. +def caget_many(pvlist, as_string=False, as_numpy=True, count=None, + timeout=1.0, conn_timeout=1.0): + """get values for a list of PVs, working as fast as possible + + Arguments + --------- + pvlist (list): list of pv names to fetch + as_string (bool): whether to get values as strings [False] + as_numpy (bool): whether to get values as numpy arrys [True] + count (int or None): max number of elements to get [None] + timeout (float): timeout on *each* get() [1.0] + conn_timeout (float): timeout for *all* pvs to connect [1.0] + + Returns + -------- + list of values, with `None` signifying 'not connected' or 'timed out'. + + Notes + ------ + this does not cache PV objects. + """ - chids, out = [], [] - for name in pvlist: chids.append(ca.create_channel(name, - auto_cb=False, - connect=False)) - for chid in chids: ca.connect_channel(chid) - for chid in chids: ca.get(chid, count=count, as_string=as_string, as_numpy=as_numpy, wait=False) - for chid in chids: out.append(ca.get_complete(chid, - count=count, - as_string=as_string, - as_numpy=as_numpy, - timeout=timeout)) + chids, connected, out = [], [], [] + for name in pvlist: + chids.append(ca.create_channel(name, auto_cb=False, connect=False)) + + all_connected = False + expire_time = time.time() + timeout + while (not all_connected and (time.time() < expire_time)): + connected = [dbr.CS_CONN==ca.state(chid) for chid in chids] + all_connected = all(connected) + poll() + + for (chid, conn) in zip(chids, connected): + if conn: + ca.get(chid, count=count, as_string=as_string, as_numpy=as_numpy, + wait=False) + + poll() + for (chid, conn) in zip(chids, connected): + val = None + if conn: + val = ca.get_complete(chid, count=count, as_string=as_string, + as_numpy=as_numpy, timeout=timeout) + out.append(val) return out def caput_many(pvlist, values, wait=False, connection_timeout=None, put_timeout=60): """put values to a list of PVs, as fast as possible - This does not maintain the PV objects it makes. If + This does not maintain the PV objects it makes. If wait is 'each', *each* put operation will block until it is complete or until the put_timeout duration expires. If wait is 'all', this method will block until *all* @@ -186,7 +221,7 @@ def caput_many(pvlist, values, wait=False, connection_timeout=None, put_timeout= """ if len(pvlist) != len(values): raise ValueError("List of PV names must be equal to list of values.") - out = [] + out = [] pvs = [PV(name, auto_monitor=False, connection_timeout=connection_timeout) for name in pvlist] conns = [p.connected for p in pvs] wait_all = (wait == 'all') @@ -203,5 +238,3 @@ def caput_many(pvlist, values, wait=False, connection_timeout=None, put_timeout= return [1 if (p.connected and p.put_complete) else -1 for p in pvs] else: return [o if o == 1 else -1 for o in out] - - diff --git a/epics/_version.py b/epics/_version.py index 84386be..9098d43 100644 --- a/epics/_version.py +++ b/epics/_version.py @@ -23,9 +23,9 @@ def get_keywords(): # setup.py/versioneer.py will grep for the variable names, so they must # each be defined on a line of their own. _version.py will just call # get_keywords(). - git_refnames = "$Format:%d$" - git_full = "$Format:%H$" - git_date = "$Format:%ci$" + git_refnames = " (tag: 3.4.3)" + git_full = "b070e5cc7c47914d9ac96ce16e471e772a273b8e" + git_date = "2020-09-17 10:36:44 -0500" keywords = {"refnames": git_refnames, "full": git_full, "date": git_date} return keywords diff --git a/epics/alarm.py b/epics/alarm.py index db46427..31e698f 100644 --- a/epics/alarm.py +++ b/epics/alarm.py @@ -30,7 +30,7 @@ class Alarm(object): alert_delay time (in seconds) to stay quiet after executing a callback. this is a minimum time, as it is checked only when a PVs value actually changes. See note below. - + example: >>> from epics import alarm, poll >>> def alarmHandler(pvname=None, value=None, **kw): @@ -44,7 +44,7 @@ class Alarm(object): >>> poll() when 'XX.VAL' exceeds (is 'gt') 2.0, the alarmHandler will be called. - + notes: alarm_delay: The alarm delay avoids over-notification by specifying a @@ -52,18 +52,18 @@ class Alarm(object): sent, even if a value is changing and out-of-range. Since Epics callback are used to process events, the alarm state will only be checked when a PV's value changes. - + callback function: the user-supplied callback function should be prepared for a large number of keyword arguments: use **kw!!! For further explanation, see notes in pv.py. - + These keyword arguments will always be included: - + pvname name of PV value current value of PV char_value text string for PV trip_point will hold the trip point used to define 'out of range' - comparison string + comparison string self.user_callback(pvname=pvname, value=value, char_value=char_value, trip_point=self.trip_point, @@ -82,7 +82,7 @@ class Alarm(object): '>=': operator.__ge__, 'gt': operator.__gt__, '>' : operator.__gt__ } - + def __init__(self, pvname, comparison=None, trip_point=None, callback=None, alert_delay=10): @@ -91,12 +91,12 @@ def __init__(self, pvname, comparison=None, trip_point=None, elif is_string(pvname): self.pv = pv.get_pv(pvname) self.pv.connect() - + if self.pv is None or comparison is None or trip_point is None: msg = 'alarm requires valid PV, comparison, and trip_point' raise UserWarning(msg) - - + + self.trip_point = trip_point self.last_alert = 0 @@ -105,27 +105,27 @@ def __init__(self, pvname, comparison=None, trip_point=None, self.cmp = None self.comp_name = 'Not Defined' - if hasattr(comparison, '__call__'): + if callable(comparison): self.comp_name = comparison.__name__ - self.cmp = comparison + self.cmp = comparison elif comparison is not None: self.cmp = self.ops.get(comparison.replace('_', ''), None) if self.cmp is not None: self.comp_name = comparison - + self.alarm_state = False self.pv.add_callback(self.check_alarm) self.check_alarm() - + def __repr__(self): return "" % (self.pv.name, self.comp_name, self.trip_point) def reset(self): - "resets the alarm state" + "resets the alarm state" self.last_alert = 0 self.alarm_state = False - + def check_alarm(self, pvname=None, value=None, char_value=None, **kw): """checks alarm status, act if needed. """ @@ -138,19 +138,17 @@ def check_alarm(self, pvname=None, value=None, char_value=None, **kw): old_alarm_state = self.alarm_state self.alarm_state = self.cmp(val, self.trip_point) - now = time.time() + now = time.time() if (self.alarm_state and not old_alarm_state and ((now - self.last_alert) > self.alert_delay)) : self.last_alert = now - if hasattr(self.user_callback, '__call__'): + if callable(self.user_callback): self.user_callback(pvname=pvname, value=value, char_value=char_value, trip_point=self.trip_point, comparison=self.comp_name, **kw) - + else: sys.stdout.write('Alarm: %s=%s (%s)\n' % (pvname, char_value, time.ctime())) - - diff --git a/epics/autosave/save_restore.py b/epics/autosave/save_restore.py index 948b15b..cd0e5aa 100755 --- a/epics/autosave/save_restore.py +++ b/epics/autosave/save_restore.py @@ -21,9 +21,9 @@ """ -from pyparsing import Literal, Optional, Word, Combine, Regex, Group, \ - ZeroOrMore, OneOrMore, LineEnd, LineStart, StringEnd, \ - alphanums, alphas, nums +from pyparsing import (Literal, Optional, Word, Combine, Regex, Group, + ZeroOrMore, OneOrMore, LineEnd, LineStart, StringEnd, + alphanums, alphas, nums, printables) import sys import os @@ -178,12 +178,12 @@ def _parse_request_file(request_file, macro_values={}): Optional( point + Optional(number) ) ).setParseAction(lambda t:float(t[0])) -# (originally I had pyparsing pulling out the $(Macro) references from inside names -# as well, but the framework doesn't work especially well without whitespace delimiters between -# tokens so we just do simple find/replace in a second pass -pv_name = Word(alphanums+":._$()") +# PV names according to app developer guide and tech-talk email thread at: +# https://epics.anl.gov/tech-talk/2019/msg01429.php +pv_name = Combine(Word(alphanums+'_-+:[]<>;{}') + + Optional(Combine('.') + Word(printables))) +pv_value = (float_number | Word(printables)) -pv_value = (float_number | Word(alphanums)) pv_assignment = pv_name + pv_value comment = Literal("#") + Regex(r".*") diff --git a/epics/ca.py b/epics/ca.py index 7a1feba..8dce835 100755 --- a/epics/ca.py +++ b/epics/ca.py @@ -15,17 +15,19 @@ import ctypes import ctypes.util +import atexit +import collections +import functools import os import sys +import threading import time -import logging -from math import log10 -import atexit import warnings -from threading import Thread + +from math import log10 from pkg_resources import resource_filename -from .utils import (STR2BYTES, BYTES2STR, NULLCHAR, NULLCHAR_2, +from .utils import (STR2BYTES, BYTES2STR, NULLCHAR_2, strjoin, memcopy, is_string, is_string_or_bytes, ascii_string, clib_search_path) @@ -63,6 +65,9 @@ def write(msg, newline=True, flush=True): AUTO_CLEANUP = True +# A sentinel to mark libca as going through the shutdown process +_LIBCA_FINALIZED = object() + ## # maximum element count for auto-monitoring of PVs in epics.pv # and for automatic conversion of numerical array data to numpy arrays @@ -74,26 +79,37 @@ def write(msg, newline=True, flush=True): DEFAULT_CONNECTION_TIMEOUT = 2.0 ## Cache of existing channel IDs: -# pvname: {'chid':chid, 'conn': isConnected, -# 'ts': ts_conn, 'callbacks': [ user_callback... ]) -# isConnected = True/False: if connected. -# ts_conn = ts of last connection event or failed attempt. -# user_callback = one or more user functions to be called on -# change (accumulated in the cache) -_cache = {} -_namecache = {} +# Keyed on context, then on pv name (e.g., _cache[ctx][pvname]) +_cache = collections.defaultdict(dict) +_chid_cache = {} + +# Puts with completion in progress: +_put_completes = [] # logging.basicConfig(filename='ca.log',level=logging.DEBUG) -## Cache of pvs waiting for put to be done. -_put_done = {} - -# get a unique python value that cannot be a value held by an -# actual PV to signal "Get is incomplete, awaiting callback" -class Empty: - """used to create a unique python value that cannot be - held as an actual PV value""" - pass -GET_PENDING = Empty() + +class _GetPending: + """ + A unique python object that cannot be a value held by an actual PV to + signal "Get is incomplete, awaiting callback" + """ + def __repr__(self): + return 'GET_PENDING' + + +Empty = _GetPending # back-compat +GET_PENDING = _GetPending() + + +class _SentinelWithLock: + """ + Used in create_channel, this sentinel ensures that two threads in the same + CA context do not conflict if they call `create_channel` with the same + pvname at the exact same time. + """ + def __init__(self): + self.lock = threading.Lock() + class ChannelAccessException(Exception): """Channel Access Exception: General Errors""" @@ -103,6 +119,14 @@ def __init__(self, *args): if type_ is not None: sys.excepthook(type_, value, traceback) +class ChannelAccessGetFailure(Exception): + """Channel Access Exception: _onGetEvent != ECA_NORMAL""" + def __init__(self, message, chid, status): + super(ChannelAccessGetFailure, self).__init__(message) + self.chid = chid + self.status = status + + class CASeverityException(Exception): """Channel Access Severity Check Exception: PySEVCHK got unexpected return value""" @@ -114,6 +138,131 @@ def __str__(self): return " %s returned '%s'" % (self.fcn, self.msg) +class _CacheItem: + ''' + The cache state for a single chid in a context. + + This class itself is not thread-safe; it is expected that callers will use + the lock appropriately when modifying the state. + + Attributes + ---------- + lock : threading.RLock + A lock for modifying the state + conn : bool + The connection status + context : int + The context in which this is CacheItem was created in + chid : ctypes.c_long + The channel ID + pvname : str + The PV name + ts : float + The connection timestamp (or last failed attempt) + failures : int + Number of failed connection attempts + get_results : dict + Keyed on the requested field type -> requested value + callbacks : list + One or more user functions to be called on change of connection status + access_event_callbacks : list + One or more user functions to be called on change of access rights + ''' + + def __init__(self, chid, pvname, callbacks=None, ts=0): + self._chid = None + self.context = current_context() + self.lock = threading.RLock() + self.conn = False + self.pvname = pvname + self.ts = ts + self.failures = 0 + + self.get_results = collections.defaultdict(lambda: [None]) + + if callbacks is None: + callbacks = [] + + self.callbacks = callbacks + self.access_event_callback = [] + self.chid = chid + + @property + def chid(self): + return self._chid + + @chid.setter + def chid(self, chid): + if chid is not None and not isinstance(chid, dbr.chid_t): + chid = dbr.chid_t(chid) + + self._chid = chid + + def __repr__(self): + return ( + '<{} {!r} {} failures={} callbacks={} access_callbacks={} chid={}>' + ''.format(self.__class__.__name__, + self.pvname, + 'connected' if self.conn else 'disconnected', + self.failures, + len(self.callbacks), + len(self.access_event_callback), + self.chid_int, + ) + ) + + def __getitem__(self, key): + # back-compat + return getattr(self, key) + + @property + def chid_int(self): + 'The channel id, as an integer' + return _chid_to_int(self.chid) + + def run_access_event_callbacks(self, ra, wa): + ''' + Run all access event callbacks + + Parameters + ---------- + ra : bool + Read-access + wa : bool + Write-access + ''' + for callback in list(self.access_event_callback): + if callable(callback): + callback(ra, wa) + + def run_connection_callbacks(self, conn, timestamp): + ''' + Run all connection callbacks + + Parameters + ---------- + conn : bool + Connected (True) or disconnected + timestamp : float + The event timestamp + ''' + # Lock here, as create_channel may be setting the chid + with self.lock: + self.conn = conn + self.ts = timestamp + self.failures = 0 + + chid_int = self.chid_int + for callback in list(self.callbacks): + if callable(callback): + # The following sleep is here only to allow other threads the + # opportunity to grab the Python GIL. (see pyepics/pyepics#171) + time.sleep(0) + + # print( ' ==> connection callback ', callback, conn) + callback(pvname=self.pvname, chid=chid_int, conn=self.conn) + + def _find_lib(inp_lib_name): """ find location of ca dynamic library @@ -125,7 +274,7 @@ def _find_lib(inp_lib_name): if dllpath is not None and inp_lib_name != 'ca': _parent, _name = os.path.split(dllpath) dllpath = os.path.join(_parent, _name.replace('ca', inp_lib_name)) - + if (dllpath is not None and os.path.exists(dllpath) and os.path.isfile(dllpath)): return dllpath @@ -155,7 +304,7 @@ def envpath2list(envname, path_sep): plist = [''] try: plist = os.environ.get(envname, '').split(path_sep) - except AttributError: + except AttributeError: pass return plist @@ -214,7 +363,7 @@ def initialize_libca(): if 'EPICS_CA_MAX_ARRAY_BYTES' not in os.environ: os.environ['EPICS_CA_MAX_ARRAY_BYTES'] = "%i" % 2**24 - global libca, initial_context, _cache + global libca, initial_context if os.name == 'nt': load_dll = ctypes.windll.LoadLibrary @@ -278,21 +427,21 @@ def finalize_libca(maxtime=10.0): """ global libca - global _cache - if libca is None: + if libca is None or libca is _LIBCA_FINALIZED: return try: start_time = time.time() flush_io() poll() - for ctxid, ctx in _cache.items(): - for pvname, info in ctx.items(): - try: - clear_channel(info['chid']) - except KeyError: - pass - ctx.clear() + for chid, entry in list(_chid_cache.items()): + try: + clear_channel(chid) + except ChannelAccessException: + pass + + _chid_cache.clear() _cache.clear() + flush_count = 0 while (flush_count < 5 and time.time()-start_time < maxtime): @@ -300,27 +449,42 @@ def finalize_libca(maxtime=10.0): poll() flush_count += 1 context_destroy() - libca = None - except Exception: + libca = _LIBCA_FINALIZED + except: pass time.sleep(0.01) + def get_cache(pvname): - "return cache dictionary for a given pvname in the current context" + "return _CacheItem for a given pvname in the current context" return _cache[current_context()].get(pvname, None) + +def _get_cache_by_chid(chid): + 'return _CacheItem for a given channel id' + try: + return _chid_cache[chid] + except KeyError: + # It's possible that the channel id cache is not yet ready; check the + # context cache before giving up. This branch should not happen often. + context = current_context() + if context is not None: + pvname = BYTES2STR(libca.ca_name(dbr.chid_t(chid))) + return _cache[context][pvname] + raise + + def show_cache(print_out=True): """print out a listing of PVs in the current session to standard output. Use the *print_out=False* option to be returned the listing instead of having it printed out. """ - global _cache out = [] out.append('# PVName ChannelID/Context Connected?') out.append('#--------------------------------------------') for context, context_chids in list(_cache.items()): for vname, val in list(context_chids.items()): - chid = val['chid'] + chid = val.chid if len(vname) < 15: vname = (vname + ' '*15)[:15] out.append(" %s %s/%s %s" % (vname, repr(chid), @@ -341,9 +505,8 @@ def clear_cache(): """ # Clear global state variables - global _cache _cache.clear() - _put_done.clear() + _chid_cache.clear() # Clear the cache of PVs used by epics.caget()-like functions from . import pv @@ -375,15 +538,15 @@ def withCA(fcn): Note that CA functions that take a Channel ID (chid) as an argument are NOT wrapped by this: to get a chid, the library must have been initialized already.""" + @functools.wraps(fcn) def wrapper(*args, **kwds): "withCA wrapper" global libca if libca is None: initialize_libca() + elif libca is _LIBCA_FINALIZED: + return # Avoid raising exceptions when Python shutting down return fcn(*args, **kwds) - wrapper.__doc__ = fcn.__doc__ - wrapper.__name__ = fcn.__name__ - wrapper.__dict__.update(fcn.__dict__) return wrapper def withCHID(fcn): @@ -395,8 +558,13 @@ def withCHID(fcn): # It may be worth making a chid class (which could hold connection # data of _cache) that could be tested here. For now, that # seems slightly 'not low-level' for this module. + @functools.wraps(fcn) def wrapper(*args, **kwds): "withCHID wrapper" + global libca + if libca is _LIBCA_FINALIZED: + return # Avoid raising exceptions when Python shutting down + if len(args)>0: chid = args[0] args = list(args) @@ -406,21 +574,25 @@ def wrapper(*args, **kwds): msg = "%s: not a valid chid %s %s args %s kwargs %s!" % ( (fcn.__name__, chid, type(chid), args, kwds)) raise ChannelAccessException(msg) - + if chid.value not in _chid_cache: + raise ChannelAccessException('Unexpected channel ID') return fcn(*args, **kwds) - wrapper.__doc__ = fcn.__doc__ - wrapper.__name__ = fcn.__name__ - wrapper.__dict__.update(fcn.__dict__) return wrapper + def withConnectedCHID(fcn): """decorator to ensure that the first argument of a function is a fully connected Channel ID, ``chid``. This test is (intended to be) robust, and will try to make sure a ``chid`` is actually connected before calling the decorated function. """ + @functools.wraps(fcn) def wrapper(*args, **kwds): "withConnectedCHID wrapper" + global libca + if libca is _LIBCA_FINALIZED: + return # Avoid raising exceptions when Python shutting down + if len(args)>0: chid = args[0] args = list(args) @@ -431,28 +603,49 @@ def wrapper(*args, **kwds): (fcn.__name__)) if not isConnected(chid): timeout = kwds.get('timeout', DEFAULT_CONNECTION_TIMEOUT) - fmt ="%s() timed out waiting '%s' to connect (%d seconds)" - if not connect_channel(chid, timeout=timeout): + connected = connect_channel(chid, timeout=timeout) + if not connected: + fmt ="%s() timed out waiting '%s' to connect (%d seconds)" raise ChannelAccessException(fmt % (fcn.__name__, - name(chid), timeout)) + name(chid), timeout)) return fcn(*args, **kwds) - wrapper.__doc__ = fcn.__doc__ - wrapper.__name__ = fcn.__name__ - wrapper.__dict__.update(fcn.__dict__) + return wrapper + +def withMaybeConnectedCHID(fcn): + """decorator to **try** to ensure that the first argument of a function + is a connected Channel ID, ``chid``. + """ + @functools.wraps(fcn) + def wrapper(*args, **kwds): + "withMaybeConnectedCHID wrapper" + global libca + if libca is _LIBCA_FINALIZED: + return # Avoid raising exceptions when Python shutting down + + if len(args)>0: + chid = args[0] + args = list(args) + if isinstance(chid, int): + args[0] = chid = dbr.chid_t(chid) + if not isinstance(chid, dbr.chid_t): + raise ChannelAccessException("%s: not a valid chid!" % \ + (fcn.__name__)) + if not isConnected(chid): + timeout = kwds.get('timeout', DEFAULT_CONNECTION_TIMEOUT) + connect_channel(chid, timeout=timeout) + return fcn(*args, **kwds) return wrapper def withInitialContext(fcn): """decorator to ensure that the wrapped function uses the initial threading context created at initialization of CA """ + @functools.wraps(fcn) def wrapper(*args, **kwds): "withInitialContext wrapper" use_initial_context() return fcn(*args, **kwds) - wrapper.__doc__ = fcn.__doc__ - wrapper.__name__ = fcn.__name__ - wrapper.__dict__.update(fcn.__dict__) return wrapper def PySEVCHK(func_name, status, expected=dbr.ECA_NORMAL): @@ -474,186 +667,107 @@ def withSEVCHK(fcn): function whose return value is from a corresponding libca function and whose return value should be ``dbr.ECA_NORMAL``. """ + @functools.wraps(fcn) def wrapper(*args, **kwds): "withSEVCHK wrapper" status = fcn(*args, **kwds) return PySEVCHK( fcn.__name__, status) - wrapper.__doc__ = fcn.__doc__ - wrapper.__name__ = fcn.__name__ - wrapper.__dict__.update(fcn.__dict__) return wrapper ## ## Event Handler for monitor event callbacks def _onMonitorEvent(args): """Event Handler for monitor events: not intended for use""" + try: + entry = _get_cache_by_chid(args.chid) + except KeyError: + # In case the chid is no longer in our cache, exit now. + return # If read access to a process variable is lost, this callback is invoked # indicating the loss in the status argument. Users can use the connection # callback to get informed of connection loss, so we just ignore any # bad status codes. - # for 64-bit python on Windows! - if dbr.PY64_WINDOWS: - args = args.contents - if args.status != dbr.ECA_NORMAL: return value = dbr.cast_args(args) - pvname = name(args.chid) kwds = {'ftype':args.type, 'count':args.count, - 'chid':args.chid, 'pvname': pvname} + 'chid': args.chid, 'pvname': entry.pvname} # add kwds arguments for CTRL and TIME variants # this is in a try/except clause to avoid problems # caused by uninitialized waveform arrays - if args.type >= dbr.CTRL_STRING: - try: - tmpv = value[0] - for attr in dbr.ctrl_limits + ('precision', 'units', 'status', 'severity'): - if hasattr(tmpv, attr): - kwds[attr] = getattr(tmpv, attr) - if attr == 'units': - kwds[attr] = BYTES2STR(getattr(tmpv, attr, None)) - - if (hasattr(tmpv, 'strs') and hasattr(tmpv, 'no_str') and - tmpv.no_str > 0): - kwds['enum_strs'] = tuple([tmpv.strs[i].value for - i in range(tmpv.no_str)]) - except IndexError: - pass - elif args.type >= dbr.TIME_STRING: - try: - tmpv = value[0] - kwds['status'] = tmpv.status - kwds['severity'] = tmpv.severity - kwds['timestamp'] = dbr.make_unixtime(tmpv.stamp) - kwds['posixseconds'] = tmpv.stamp.secs + dbr.EPICS2UNIX_EPOCH - kwds['nanoseconds'] = tmpv.stamp.nsec - except IndexError: - pass + try: + kwds.update(**_unpack_metadata(ftype=args.type, dbr_value=value[0])) + except IndexError: + pass value = _unpack(args.chid, value, count=args.count, ftype=args.type) - if hasattr(args.usr, '__call__'): + if callable(args.usr): args.usr(value=value, **kwds) ## connection event handler: def _onConnectionEvent(args): - """set flag in cache holding whteher channel is - connected. if provided, run a user-function""" - # for 64-bit python on Windows! - if dbr.PY64_WINDOWS: - args = args.contents + "Connection notification - run user callbacks" + try: + entry = _get_cache_by_chid(args.chid) + except KeyError: + return + + entry.run_connection_callbacks(conn=(args.op == dbr.OP_CONN_UP), + timestamp=time.time()) - ctx = current_context() - conn = (args.op == dbr.OP_CONN_UP) - global _cache - - if ctx is None and len(_cache.keys()) > 0: - ctx = list(_cache.keys())[0] - if ctx not in _cache: - _cache[ctx] = {} - - # search for PV in any context... - pv_found = False - for context in _cache: - pvname = name(args.chid) - - if pvname in _cache[context]: - pv_found = True - break - - # logging.debug("ConnectionEvent %s/%i/%i " % (pvname, args.chid, conn)) - # print("ConnectionEvent %s/%i/%i " % (pvname, args.chid, conn)) - if not pv_found: - _cache[ctx][pvname] = {'conn':False, 'chid': args.chid, - 'ts':0, 'failures':0, 'value': None, - 'callbacks': []} - - # set connection time, run connection callbacks - # in all contexts - for context, cvals in _cache.items(): - if pvname in cvals: - entry = cvals[pvname] - ichid = entry['chid'] - if isinstance(entry['chid'], dbr.chid_t): - ichid = entry['chid'].value - - if int(ichid) == int(args.chid): - chid = args.chid - entry.update({'chid': chid, 'conn': conn, - 'ts': time.time(), 'failures': 0}) - for callback in entry.get('callbacks', []): - poll() - if hasattr(callback, '__call__'): - # print( ' ==> connection callback ', callback, conn) - callback(pvname=pvname, chid=chid, conn=conn) - #print('Connection done') - - return ## get event handler: def _onGetEvent(args, **kws): """get_callback event: simply store data contents which will need conversion to python data with _unpack().""" - # for 64-bit python on Windows! - if dbr.PY64_WINDOWS: - args = args.contents - # print("GET EVENT: chid, user ", args.chid, args.usr) # print("GET EVENT: type, count ", args.type, args.count) # print("GET EVENT: status ", args.status, dbr.ECA_NORMAL) - global _cache - if args.status != dbr.ECA_NORMAL: + try: + entry = _get_cache_by_chid(args.chid) + except KeyError: return - if dbr.IRON_PYTHON: - get_cache(name(args.chid))[args.usr.value] = (dbr.cast_args(args)) + ftype = (args.usr.value if dbr.IRON_PYTHON + else args.usr) + + if args.status != dbr.ECA_NORMAL: + result = ChannelAccessGetFailure( + 'Get failed; status code: %d' % args.status, + chid=args.chid, + status=args.status + ) + elif dbr.IRON_PYTHON: + result = dbr.cast_args(args) else: - get_cache(name(args.chid))[args.usr] = memcopy(dbr.cast_args(args)) + result = memcopy(dbr.cast_args(args)) + + with entry.lock: + entry.get_results[ftype][0] = result ## put event handler: def _onPutEvent(args, **kwds): - """set put-has-completed for this channel, - call optional user-supplied callback""" - # for 64-bit python on Windows! - if dbr.PY64_WINDOWS: - args = args.contents - - pvname = name(args.chid) - fcn = _put_done[pvname][1] - data = _put_done[pvname][2] - _put_done[pvname] = (True, None, None) - if hasattr(fcn, '__call__'): - if isinstance(data, dict): - kwds.update(data) - elif data is not None: - kwds['data'] = data - fcn(pvname=pvname, **kwds) + 'Put completion notification - run specified callback' + fcn = args.usr + if callable(fcn): + fcn() def _onAccessRightsEvent(args): - # for 64-bit python on Windows! - global _cache - if dbr.PY64_WINDOWS: - args = args.contents - - chid = args.chid - ra = bool(args.read_access) - wa = bool(args.write_access) - - # Getting bunk result from ca.current_context on channel disconnect - # Do this the long way... - for ctx in _cache.values(): - pvname = name(chid) - if pvname in ctx: - ch = ctx[pvname] - if 'access_event_callback' in ch: - for callback in ch['access_event_callback']: - if callable(callback): - callback(ra, wa) + 'Access rights callback' + try: + entry = _chid_cache[_chid_to_int(args.chid)] + except KeyError: + return + read = bool(args.access & 1) + write = bool((args.access >> 1) & 1) + entry.run_access_event_callbacks(read, write) + # create global reference to these callbacks _CB_CONNECT = dbr.make_callback(_onConnectionEvent, dbr.connection_args) @@ -674,11 +788,7 @@ def context_create(ctx=None): "create a context. if argument is None, use PREEMPTIVE_CALLBACK" if ctx is None: ctx = {False:0, True:1}[PREEMPTIVE_CALLBACK] - ret = libca.ca_context_create(ctx) - new_ctx = current_context() - if new_ctx and new_ctx not in _cache: - _cache[new_ctx] = {} - return ret + return libca.ca_context_create(ctx) def create_context(ctx=None): @@ -703,12 +813,11 @@ def create_context(ctx=None): @withCA def context_destroy(): "destroy current context" - global _cache ctx = current_context() ret = libca.ca_context_destroy() - if ctx in _cache: - _cache[ctx].clear() - _cache.pop(ctx) + ctx_cache = _cache.pop(ctx, None) + if ctx_cache is not None: + ctx_cache.clear() return ret def destroy_context(): @@ -866,54 +975,47 @@ def create_channel(pvname, connect=False, auto_cb=True, callback=None): """ - # # Note that _CB_CONNECT (defined above) is a global variable, holding # a reference to _onConnectionEvent: This is really the connection # callback that is run -- the callack here is stored in the _cache # and called by _onConnectionEvent. - pvn = STR2BYTES(pvname) - ctx = current_context() - global _cache - if ctx not in _cache: - _cache[ctx] = {} - if pvname not in _cache[ctx]: # new PV for this context - entry = {'conn':False, 'chid': None, - 'ts': 0, 'failures':0, 'value': None, - 'callbacks': [ callback ]} - # logging.debug("Create Channel %s " % pvname) - _cache[ctx][pvname] = entry - else: - entry = _cache[ctx][pvname] - if not entry['conn'] and callback is not None: # pending connection - _cache[ctx][pvname]['callbacks'].append(callback) - elif (hasattr(callback, '__call__') and - not callback in entry['callbacks']): - entry['callbacks'].append(callback) - callback(chid=entry['chid'], pvname=pvname, conn=entry['conn']) - - conncb = 0 - if auto_cb: - conncb = _CB_CONNECT - if entry.get('chid', None) is not None: - # already have or waiting on a chid - chid = _cache[ctx][pvname]['chid'] - else: - chid = dbr.chid_t() - ret = libca.ca_create_channel(ctypes.c_char_p(pvn), conncb, 0, 0, - ctypes.byref(chid)) - PySEVCHK('create_channel', ret) - entry['chid'] = chid - - chid_key = chid - if isinstance(chid_key, dbr.chid_t): - chid_key = chid.value - _namecache[chid_key] = BYTES2STR(pvn) - # print("CREATE Channel ", pvn, chid) + + context_cache = _cache[current_context()] + + # {}.setdefault is an atomic operation, so we are guaranteed to never + # create the same channel twice here: + with context_cache.setdefault(pvname, _SentinelWithLock()).lock: + # Grab the entry again from the cache. Between the time the lock was + # attempted and acquired, the cache may have changed. + entry = context_cache[pvname] + is_new_channel = isinstance(entry, _SentinelWithLock) + if is_new_channel: + callbacks = [callback] if callable(callback) else None + entry = _CacheItem(chid=None, pvname=pvname, callbacks=callbacks) + context_cache[pvname] = entry + + chid = dbr.chid_t() + with entry.lock: + ret = libca.ca_create_channel( + ctypes.c_char_p(STR2BYTES(pvname)), _CB_CONNECT, 0, 0, + ctypes.byref(chid) + ) + PySEVCHK('create_channel', ret) + + entry.chid = chid + _chid_cache[chid.value] = entry + + if (not is_new_channel and callable(callback) and + callback not in entry.callbacks): + entry.callbacks.append(callback) + if entry.chid is not None and entry.conn: + # Run the connection callback if already connected: + callback(chid=_chid_to_int(entry.chid), pvname=pvname, + conn=entry.conn) + if connect: - connect_channel(chid) - if conncb != 0: - poll() - return chid + connect_channel(entry.chid) + return entry.chid @withCHID def connect_channel(chid, timeout=None, verbose=False): @@ -961,10 +1063,6 @@ def connect_channel(chid, timeout=None, verbose=False): start_time = time.time() ctx = current_context() pvname = name(chid) - global _cache - if ctx not in _cache: - _cache[ctx] = {} - if timeout is None: timeout = DEFAULT_CONNECTION_TIMEOUT @@ -972,38 +1070,44 @@ def connect_channel(chid, timeout=None, verbose=False): poll() conn = (state(chid) == dbr.CS_CONN) if not conn: - _cache[ctx][pvname]['ts'] = time.time() - _cache[ctx][pvname]['failures'] += 1 + entry = _cache[ctx][pvname] + with entry.lock: + entry.ts = time.time() + entry.failures += 1 return conn # functions with very light wrappings: @withCHID def replace_access_rights_event(chid, callback=None): - global _cache + ch = get_cache(name(chid)) - ctx = current_context() - ch = _cache[ctx][name(chid)] - if 'access_event_callback' not in ch: - ch.update({'access_event_callback': list()}) - - if callback is not None: - ch['access_event_callback'].append(callback) + if ch and callback is not None: + ch.access_event_callback.append(callback) ret = libca.ca_replace_access_rights_event(chid, _CB_ACCESS) PySEVCHK('replace_access_rights_event', ret) +def _chid_to_int(chid): + ''' + Return the integer representation of a chid + + Parameters + ---------- + chid : ctypes.c_long, int + + Returns + ------- + chid : int + ''' + if hasattr(chid, 'value'): + return int(chid.value) + return chid + + @withCHID def name(chid): "return PV name for channel name" - global _namecache - # sys.stdout.write("NAME %s %s\n" % (repr(chid), repr(chid.value in _namecache))) - # sys.stdout.flush() - - if chid.value in _namecache: - val = _namecache[chid.value] - else: - val = _namecache[chid.value] = BYTES2STR(libca.ca_name(chid)) - return val + return BYTES2STR(libca.ca_name(chid)) @withCHID def host_name(chid): @@ -1035,7 +1139,15 @@ def field_type(chid): @withCHID def clear_channel(chid): "clear the channel" - return libca.ca_clear_channel(chid) + ret = libca.ca_clear_channel(chid) + entry = _chid_cache.pop(chid.value, None) + if entry is not None: + context_cache = _cache[entry.context] + context_cache.pop(entry.pvname, None) + with entry.lock: + entry.chid = None + return ret + @withCHID def state(chid): @@ -1058,10 +1170,15 @@ def access(chid): acc = read_access(chid) + 2 * write_access(chid) return ('no access', 'read-only', 'write-only', 'read/write')[acc] +@withCHID def promote_type(chid, use_time=False, use_ctrl=False): """promotes the native field type of a ``chid`` to its TIME or CTRL variant. Returns the integer corresponding to the promoted field value.""" - ftype = field_type(chid) + return promote_fieldtype( field_type(chid), use_time=use_time, use_ctrl=use_ctrl) + +def promote_fieldtype(ftype, use_time=False, use_ctrl=False): + """promotes the native field type to its TIME or CTRL variant. + Returns the integer corresponding to the promoted field value.""" if use_ctrl: ftype += dbr.CTRL_STRING elif use_time: @@ -1070,9 +1187,10 @@ def promote_type(chid, use_time=False, use_ctrl=False): ftype = dbr.TIME_STRING return ftype + def _unpack(chid, data, count=None, ftype=None, as_numpy=True): """unpacks raw data for a Channel ID `chid` returned by libca functions - including `ca_get_array_callback` or subscription callback, and returns + including `ca_array_get_callback` or subscription callback, and returns the corresponding Python data Normally, users are not expected to need to access this function, but @@ -1090,8 +1208,6 @@ def _unpack(chid, data, count=None, ftype=None, as_numpy=True): data type of channel (defaults to native type of chid) as_numpy : bool whether to convert to numpy array. - - """ def scan_string(data, count): @@ -1135,9 +1251,11 @@ def unpack(data, count, ntype, use_numpy, elem_count): # Grab the native-data-type data try: - data = data[1] + extended_data, data = data except (TypeError, IndexError): return None + except ValueError: + extended_data = None if count == 0 or count is None: count = len(data) @@ -1148,12 +1266,133 @@ def unpack(data, count, ntype, use_numpy, elem_count): ftype = field_type(chid) if ftype is None: ftype = dbr.INT + ntype = native_type(ftype) elem_count = element_count(chid) use_numpy = (HAS_NUMPY and as_numpy and ntype != dbr.STRING and count != 1) return unpack(data, count, ntype, use_numpy, elem_count) -@withConnectedCHID + +def _unpack_metadata(ftype, dbr_value): + '''Unpack DBR metadata into a dictionary + + Parameters + ---------- + ftype : int + The field type for the respective DBR value + dbr_value : ctype.Structure + The structure holding the data to be unpacked + + Returns + ------- + md : dict + A dictionary containing zero or more of the following keys, depending + on ftype:: + + {'precision', 'units', 'status', 'severity', 'enum_strs', 'status', + 'severity', 'timestamp', 'posixseconds', 'nanoseconds', + 'upper_disp_limit', 'lower_disp_limit', 'upper_alarm_limit', + 'upper_warning_limit', 'lower_warning_limit','lower_alarm_limit', + 'upper_ctrl_limit', 'lower_ctrl_limit'} + ''' + md = {} + if ftype >= dbr.CTRL_STRING: + for attr in dbr.ctrl_limits + ('precision', 'units', 'status', + 'severity'): + if hasattr(dbr_value, attr): + md[attr] = getattr(dbr_value, attr) + if attr == 'units': + md[attr] = BYTES2STR(getattr(dbr_value, attr, None)) + + if hasattr(dbr_value, 'strs') and getattr(dbr_value, 'no_str', 0) > 0: + md['enum_strs'] = tuple(BYTES2STR(dbr_value.strs[i].value) + for i in range(dbr_value.no_str)) + elif ftype >= dbr.TIME_STRING: + md['status'] = dbr_value.status + md['severity'] = dbr_value.severity + md['timestamp'] = dbr.make_unixtime(dbr_value.stamp) + md['posixseconds'] = dbr_value.stamp.secs + dbr.EPICS2UNIX_EPOCH + md['nanoseconds'] = dbr_value.stamp.nsec + + return md + + +@withMaybeConnectedCHID +def get_with_metadata(chid, ftype=None, count=None, wait=True, timeout=None, + as_string=False, as_numpy=True): + """Return the current value along with metadata for a Channel + + Parameters + ---------- + chid : ctypes.c_long + Channel ID + ftype : int + field type to use (native type is default) + count : int + maximum element count to return (full data returned by default) + as_string : bool + whether to return the string representation of the value. See notes. + as_numpy : bool + whether to return the Numerical Python representation for array / + waveform data. + wait : bool + whether to wait for the data to be received, or return immediately. + timeout : float + maximum time to wait for data before returning ``None``. + + Returns + ------- + data : dict or None + The dictionary of data, guaranteed to at least have the 'value' key. + Depending on ftype, other keys may also be present:: + + {'precision', 'units', 'status', 'severity', 'enum_strs', 'status', + 'severity', 'timestamp', 'posixseconds', 'nanoseconds', + 'upper_disp_limit', 'lower_disp_limit', 'upper_alarm_limit', + 'upper_warning_limit', 'lower_warning_limit','lower_alarm_limit', + 'upper_ctrl_limit', 'lower_ctrl_limit'} + + Returns ``None`` if the channel is not connected, `wait=False` was used, + or the data transfer timed out. + + See also + -------- + See :func:`get` for additional usage notes. + """ + if ftype is None: + ftype = field_type(chid) + if ftype in (None, -1): + return None + if count is None: + count = 0 + # count = element_count(chid) + # don't default to the element_count here - let EPICS tell us the size + # in the _onGetEvent callback + else: + count = min(count, element_count(chid)) + + entry = get_cache(name(chid)) + if not entry: + return + + # implementation note: cached value of + # None implies no value, no expected callback + # GET_PENDING implies no value yet, callback expected. + with entry.lock: + last_get, = entry.get_results[ftype] + if last_get is not GET_PENDING: + entry.get_results[ftype] = [GET_PENDING] + ret = libca.ca_array_get_callback( + ftype, count, chid, _CB_GET, ctypes.py_object(ftype)) + PySEVCHK('get', ret) + + if wait: + return get_complete_with_metadata(chid, count=count, ftype=ftype, + timeout=timeout, as_string=as_string, + as_numpy=as_numpy) + + +@withMaybeConnectedCHID def get(chid, ftype=None, count=None, wait=True, timeout=None, as_string=False, as_numpy=True): """return the current value for a Channel. @@ -1215,42 +1454,20 @@ def get(chid, ftype=None, count=None, wait=True, timeout=None, later with :func:`get_complete`. """ - global _cache - - if ftype is None: - ftype = field_type(chid) - if ftype in (None, -1): - return None - if count is None: - count = 0 - # count = element_count(chid) - # don't default to the element_count here - let EPICS tell us the size - # in the _onGetEvent callback - else: - count = min(count, element_count(chid)) + info = get_with_metadata(chid, ftype=ftype, count=count, wait=wait, + timeout=timeout, as_string=as_string, + as_numpy=as_numpy) + return (info['value'] if info is not None else None) - ncache = _cache[current_context()][name(chid)] - # implementation note: cached value of - # None implies no value, no expected callback - # GET_PENDING implies no value yet, callback expected. - if ncache.get('value', None) is None: - ncache['value'] = GET_PENDING - ret = libca.ca_array_get_callback(ftype, count, chid, _CB_GET, - ctypes.py_object('value')) - PySEVCHK('get', ret) - if wait: - return get_complete(chid, count=count, ftype=ftype, - timeout=timeout, - as_string=as_string, as_numpy=as_numpy) +@withMaybeConnectedCHID +def get_complete_with_metadata(chid, ftype=None, count=None, timeout=None, + as_string=False, as_numpy=True): + """Returns the current value and associated metadata for a Channel -@withConnectedCHID -def get_complete(chid, ftype=None, count=None, timeout=None, - as_string=False, as_numpy=True): - """returns the current value for a Channel, completing an - earlier incomplete :func:`get` that returned ``None``, either - because `wait=False` was used or because the data transfer - did not complete before the timeout passed. + This completes an earlier incomplete :func:`get` that returned ``None``, + either because `wait=False` was used or because the data transfer did not + complete before the timeout passed. Parameters ---------- @@ -1270,21 +1487,14 @@ def get_complete(chid, ftype=None, count=None, timeout=None, Returns ------- - data : object - This function will return ``None`` if the previous :func:`get` - actually completed, or if this data transfer also times out. - - - Notes - ----- - 1. The default timeout is dependent on the element count:: - default_timout = 1.0 + log10(count) (in seconds) - - 2. Consult the doc for :func:`get` for more information. + data : dict or None + This function will return ``None`` if the previous :func:`get` actually + completed, or if this data transfer also times out. + See also + -------- + See :func:`get_complete` for additional usage notes. """ - global _cache - if ftype is None: ftype = field_type(chid) if count is None: @@ -1292,22 +1502,41 @@ def get_complete(chid, ftype=None, count=None, timeout=None, else: count = min(count, element_count(chid)) - ncache = _cache[current_context()][name(chid)] - if ncache['value'] is None: + entry = get_cache(name(chid)) + if not entry: + return + + get_result = entry.get_results[ftype] + + if get_result[0] is None: + warnings.warn('get_complete without initial get() call') return None t0 = time.time() if timeout is None: timeout = 1.0 + log10(max(1, count)) - while ncache['value'] is GET_PENDING: + + while get_result[0] is GET_PENDING: poll() + if time.time()-t0 > timeout: msg = "ca.get('%s') timed out after %.2f seconds." warnings.warn(msg % (name(chid), timeout)) return None - #print("Get Complete> Unpack ", ncache['value'], count, ftype) - val = _unpack(chid, ncache['value'], count=count, + full_value, = get_result + + # print("Get Complete> Unpack ", ncache['value'], count, ftype) + + if isinstance(full_value, Exception): + get_failure_reason = full_value + raise get_failure_reason + + # NOTE: unpacking happens for each requester; this could potentially be put + # in the get callback itself. (different downside there...) + extended_data, _ = full_value + metadata = _unpack_metadata(ftype=ftype, dbr_value=extended_data) + val = _unpack(chid, full_value, count=count, ftype=ftype, as_numpy=as_numpy) # print("Get Complete unpacked to ", val) @@ -1317,8 +1546,54 @@ def get_complete(chid, ftype=None, count=None, timeout=None, val = numpy.ctypeslib.as_array(memcopy(val)) # value retrieved, clear cached value - ncache['value'] = None - return val + metadata['value'] = val + return metadata + +@withMaybeConnectedCHID +def get_complete(chid, ftype=None, count=None, timeout=None, as_string=False, + as_numpy=True): + """returns the current value for a Channel, completing an + earlier incomplete :func:`get` that returned ``None``, either + because `wait=False` was used or because the data transfer + did not complete before the timeout passed. + + Parameters + ---------- + chid : ctypes.c_long + Channel ID + ftype : int + field type to use (native type is default) + count : int + maximum element count to return (full data returned by default) + as_string : bool + whether to return the string representation of the value. + as_numpy : bool + whether to return the Numerical Python representation + for array / waveform data. + timeout : float + maximum time to wait for data before returning ``None``. + + Returns + ------- + data : object + This function will return ``None`` if the previous :func:`get` + actually completed, or if this data transfer also times out. + + + Notes + ----- + 1. The default timeout is dependent on the element count:: + default_timout = 1.0 + log10(count) (in seconds) + + 2. Consult the doc for :func:`get` for more information. + + """ + info = get_complete_with_metadata(chid, ftype=ftype, count=count, + timeout=timeout, as_string=as_string, + as_numpy=as_numpy) + return (info['value'] if info is not None + else None) + def _as_string(val, chid, count, ftype): "primitive conversion of value to a string" @@ -1438,29 +1713,47 @@ def put(chid, value, wait=False, timeout=30, callback=None, raise ChannelAccessException(errmsg % (repr(value))) # simple put, without wait or callback - if not (wait or hasattr(callback, '__call__')): + if not (wait or callable(callback)): ret = libca.ca_array_put(ftype, count, chid, data) PySEVCHK('put', ret) poll() return ret + # wait with callback (or put_complete) pvname = name(chid) - _put_done[pvname] = (False, callback, callback_data) start_time = time.time() + completed = dict(status=False) + + def put_completed(): + completed['status'] = True + _put_completes.remove(put_completed) + if not callable(callback): + return + + if isinstance(callback_data, dict): + kwargs = callback_data + else: + kwargs = dict(data=callback_data) + + callback(pvname=pvname, **kwargs) + + _put_completes.append(put_completed) + + ret = libca.ca_array_put_callback(ftype, count, chid, data, _CB_PUTWAIT, + ctypes.py_object(put_completed)) - ret = libca.ca_array_put_callback(ftype, count, chid, - data, _CB_PUTWAIT, 0) PySEVCHK('put', ret) poll(evt=1.e-4, iot=0.05) if wait: - while not (_put_done[pvname][0] or + while not (completed['status'] or (time.time()-start_time) > timeout): poll() - if not _put_done[pvname][0]: + if not completed['status']: ret = -ret return ret -@withConnectedCHID + +@withMaybeConnectedCHID def get_ctrlvars(chid, timeout=5.0, warn=True): """return the CTRL fields for a Channel. @@ -1475,89 +1768,28 @@ def get_ctrlvars(chid, timeout=5.0, warn=True): enum_strs will be a list of strings for the names of ENUM states. """ - global _cache - ftype = promote_type(chid, use_ctrl=True) - ncache = _cache[current_context()][name(chid)] - if ncache.get('ctrl_value', None) is None: - ncache['ctrl_value'] = GET_PENDING - ret = libca.ca_array_get_callback(ftype, 1, chid, _CB_GET, - ctypes.py_object('ctrl_value')) - - PySEVCHK('get_ctrlvars', ret) - - if ncache.get('ctrl_value', None) is None: - return {} + metadata = get_with_metadata(chid, ftype=ftype, count=1, timeout=timeout, + wait=True) + if metadata is not None: + # Ignore the value returned: + metadata.pop('value', None) + return metadata - t0 = time.time() - while ncache['ctrl_value'] is GET_PENDING: - poll() - if time.time()-t0 > timeout: - if warn: - msg = "ca.get_ctrlvars('%s') timed out after %.2f seconds." - warnings.warn(msg % (name(chid), timeout)) - return {} - try: - tmpv = ncache['ctrl_value'][0] - except TypeError: - return {} - - out = {} - for attr in ('precision', 'units', 'severity', 'status', - 'upper_disp_limit', 'lower_disp_limit', - 'upper_alarm_limit', 'upper_warning_limit', - 'lower_warning_limit','lower_alarm_limit', - 'upper_ctrl_limit', 'lower_ctrl_limit'): - if hasattr(tmpv, attr): - out[attr] = getattr(tmpv, attr, None) - if attr == 'units': - out[attr] = BYTES2STR(getattr(tmpv, attr, None)) - - if (hasattr(tmpv, 'strs') and hasattr(tmpv, 'no_str') and - tmpv.no_str > 0): - out['enum_strs'] = tuple([BYTES2STR(tmpv.strs[i].value) - for i in range(tmpv.no_str)]) - ncache['ctrl_value'] = None - return out -@withConnectedCHID +@withCHID def get_timevars(chid, timeout=5.0, warn=True): """returns a dictionary of TIME fields for a Channel. This will contain keys of *status*, *severity*, and *timestamp*. """ - global _cache - ftype = promote_type(chid, use_time=True) - ncache = _cache[current_context()][name(chid)] - if ncache.get('time_value', None) is None: - ncache['time_value'] = GET_PENDING - ret = libca.ca_array_get_callback(ftype, 1, chid, _CB_GET, - ctypes.py_object('time_value')) + metadata = get_with_metadata(chid, ftype=ftype, count=1, timeout=timeout, + wait=True) + if metadata is not None: + # Ignore the value returned: + metadata.pop('value', None) + return metadata - PySEVCHK('get_timevars', ret) - - out = {} - if ncache.get('time_value', None) is None: - return out - - t0 = time.time() - while ncache['time_value'] is GET_PENDING: - poll() - if time.time()-t0 > timeout: - if warn: - msg = "ca.get_timevars('%s') timed out after %.2f seconds." - warnings.warn(msg % (name(chid), timeout)) - return {} - - tmpv = ncache['time_value'][0] - for attr in ('status', 'severity'): - if hasattr(tmpv, attr): - out[attr] = getattr(tmpv, attr) - if hasattr(tmpv, 'stamp'): - out['timestamp'] = dbr.make_unixtime(tmpv.stamp) - - ncache['time_value'] = None - return out def get_timestamp(chid): """return the timestamp of a Channel -- the time of last update.""" @@ -1587,9 +1819,9 @@ def get_enum_strings(chid): # dbr.DBE_LOG for archive changes (ie exceeding ADEL) DEFAULT_SUBSCRIPTION_MASK = dbr.DBE_VALUE|dbr.DBE_ALARM -@withConnectedCHID -def create_subscription(chid, use_time=False, use_ctrl=False, - mask=None, callback=None, count=0): +@withCHID +def create_subscription(chid, use_time=False, use_ctrl=False, ftype=None, + mask=None, callback=None, count=0, timeout=None): """create a *subscription to changes*. Sets up a user-supplied callback function to be called on any changes to the channel. @@ -1601,6 +1833,10 @@ def create_subscription(chid, use_time=False, use_ctrl=False, whether to use the TIME variant for the PV type use_ctrl : bool whether to use the CTRL variant for the PV type + ftype : integer or None + ftype to use, overriding native type, `use_time` or `use_ctrl` + if ``None``, the native type is looked up, which requires a + connected channel. mask : integer or None bitmask combination of :data:`dbr.DBE_ALARM`, :data:`dbr.DBE_LOG`, and :data:`dbr.DBE_VALUE`, to control which changes result in a callback. @@ -1609,6 +1845,9 @@ def create_subscription(chid, use_time=False, use_ctrl=False, callback : ``None`` or callable user-supplied callback function to be called on changes + timeout : ``None`` or int + connection timeout used for unconnected channels. + Returns ------- (callback_ref, user_arg_ref, event_id) @@ -1624,12 +1863,22 @@ def create_subscription(chid, use_time=False, use_ctrl=False, Keep the returned tuple in named variable!! if the return argument gets garbage collected, a coredump will occur. + If the channel is not connected, the ftype must be specified for a + successful subscription. """ mask = mask or DEFAULT_SUBSCRIPTION_MASK + if ftype is None: + if not isConnected(chid): + if timeout is None: + timeout = DEFAULT_CONNECTION_TIMEOUT + fmt ="%s() timed out waiting '%s' to connect (%d seconds)" + if not connect_channel(chid, timeout=timeout): + raise ChannelAccessException(fmt % ("create_subscription", + (chid), timeout)) + ftype = field_type(chid) - ftype = promote_type(chid, use_ctrl=use_ctrl, use_time=use_time) - + ftype = promote_fieldtype(ftype, use_time=use_time, use_ctrl=use_ctrl) uarg = ctypes.py_object(callback) evid = ctypes.c_void_p() poll() @@ -1774,11 +2023,11 @@ def sg_put(gid, chid, value): # poll() return ret -class CAThread(Thread): +class CAThread(threading.Thread): """ Sub-class of threading.Thread to ensure that the initial CA context is used. """ def run(self): use_initial_context() - Thread.run(self) + threading.Thread.run(self) diff --git a/epics/clibs/darwin64/README b/epics/clibs/darwin64/README new file mode 100644 index 0000000..0dfb70c --- /dev/null +++ b/epics/clibs/darwin64/README @@ -0,0 +1,21 @@ +These shared libraries were built using + +Epics Base 3.16.2 on Mac OS X 10.14.1 with +Apple LLVM version 10.0.0 (clang-1000.11.45.5) Target: x86_64-apple-darwin18.2.0 + +and with Perl from MacPorts. + +Readline support was turned off by setting + COMMANDLINE_LIBRARY = + +in + CONFIG_SITE.darwinCommon.darwinCommon + + +and then + mv libca.3.16.2.dylib libca.dylib + mv libCom.3.16.2.dylib libComPYEPICS.dylib + install_name_tool -id libca.dylib libca.dylib + install_name_tool -id libComPYEPICS.dylib libComPYEPICS.dylib + install_name_tool -add-rpath . libca.dylib + install_name_tool -change libComPYEPICS.dylib @loader_path/./libComPYEPICS.dylib libca.dylib diff --git a/epics/clibs/darwin64/libCom.dylib b/epics/clibs/darwin64/libCom.dylib deleted file mode 100755 index 534965ec2af6c0d9c243d3892feee9c1ea612207..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 588344 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
WD(N%-^PTA_Da2_wvd8bE!)H{KPvZ8p znu2QodTM|ZO=AYdCUNs3F;#Ebu#UC|y#(U9-XVL3>G$k@jYJmH`yXKfUno3zz}4d%Djd|gTF6B+))sU z?1|nDxh@W^(AeM66Mlsu&fpsj#?JC+z2xlSI)^pOG{jMIyul}EpYS$f z_-9O74}vOH>GL@~7PYCR8{G8W(JosdV^z`L*>uno_A5d0X{2k1G3 z?;EgmbsW!ASdw#Kl~DJ;g*WzrNbQNM1T2kt;cQLZO^C+S%&U#`4a=|;Bu zP`#lJGf1x5DE|#2mXw_X;iD87w_=l%*-R>C0#ELNg&HhDJ5%KqD2K$6NR&>iLwK@@ zHoI-0`hztP^j7sJPy}}&GNk!^A)V$bJNv)SGp%C&;SK#ljmF9-(d*8^QVac~w)e*o z1UR*sh_b=u!V5Q+*%0ZY8+SYDADeQc5q_&nG#&~xyXt-vOEJKT@mi(gc$_DX_x&52 zK`?8D?>1N6DY0~~D8=ma9i%NHa=uZ|hJ6V=;FbGm>hQEMBHxHJhXHIdOZ#gU@g^SzpcW$ijMlBqR;B`p9HavZPtS_I3NA{+6&<=qr*m~q08T&+Q zI}qN9?>@1<0JMlznNL7D=%n6I%<8qfAOj^(G!!3OhOsF-@pvEoZWThN`Y)p>2>_}Q z!!l8^D{4`UW($HbA5aX9w1P2jQOsWvBUCR3H9v%Yjgn3U>V@(Z0HsXnU^xSO^IGbl z8m&%7Al}eD#QH7}vpK<% zVliI!pk_37Kb+-YL+YUCeMj|fqUOIzF|=(wnCB&mc@r@@ji)e5$5QUiWGAGP1i84) zN*67g`@F_@9L)P5Fb`vL-|X<3pF~Oj&B00@qTrlha5D((w+4d`Qt--P@H7Q44F-J_ z92^V|Cs2vOpd3Om*7u=CVU|k$Aym$UH&G_cFum|Owh-cw>_d1957+pvM!c47hUo!B z(z#g&d+)4|LclbUm6%b3T%hY+T|hrs!+F9DHnvJf3YFpxWqzQgHX2tI19;wsy68ON z^`oxOqg#()<~H0uTV6G`)EJ$KsHT|ljYW78E@@p`pgvGrSh3%E)Cb30$B%J#jo_LA zErW>_Qyn&a`lccvykWZj^Jv2o&rd+kWXVEHC6kC4;SCSu2hV(ygv`_eO>?|T$SO=i z!KSYmF`EOb)C=x)1g~-x{`$`kWzdqHacfMz>!^B*uroHMOcd7FxQ-cpBBCH`o-&It zI@X!61{|Mc60{m)eMOpplL8nyrL9K|>&B56BP0K?T&A>6@3c$rbi zQrRz!ZW=O_9}voWfH2|wU{!2sMxpwE>ukmogMGYsv-qNxh`>?wL8xXc>EXO?3r^QqD>T?nI;q)kcs1R?6I=J&m2rE0G@gT)vpZk$wp8r4;1P~Pwg<_anL6wiq0@&>LeREp7bMKc=nS8HqI zRApQpREAADf(Atiuh;nKmX)jq9Q{!F9sL-hk>b* zm@@;xBP(9x?0t7?I6O;bOj@}Ir~3r=D`=cg#h(a)qUp-8`v2d{(-e{?$9Wn*2Ia|r z85-oX!$pdqhfsY=DaKCdDZ+ij;8w#EUE4wv+Un$2VPMCvYjm37^^?1ZQ4=|nVWTEY zl!-{N=GHksVk?yj^VTHtXeCz0|Bm{P?dY|khA03(A5S)(k8oe-Z+ZTW{J-U~pbk5p z>+mebvmDR8cpk>{44zl<9LDnlp7SxT7>Va9Jk#(zgXeoZaTs3=#B(VgGoFojs_^^~ z&r5jT!LtX?5j%e;Z{&r^6GqA^hz|B!z_y;8tFX3}DAFcweOiI16#@xy*mLPdtPY_ zIP-OKeOuKGNEXg)_^?qDm-?JKBaCbVz%#;#eP@KZbPB+Ljd}9mjXd(bGs1QCcoJ_! z4ai&L@|e)YOX_b1d)XvxbXKpn*0c||7-_5e6Rqdmp7kcol4cy<7})UGX2ZIeERTP* zSn3s*cy8TYaw{gSMEI&=P21&4zxX8wHY~Y0VEkAqjL*a=3v0kr1~%Ck$jcWD>w1T*d%+-Z|9;0Cc@)V_?gD#_oVfueD(jOvhpr1G3<*j-LUN zbcvxmApek$EDiw~$$*?Xgyo7(P2rfRAays*`M`c77F2XhE@nVdu$8F>*AqW=%!mS6M?!I^eFFq=~IQ3zu_;6OdCA|37Om|>?EOs;IRkTt6D54QJ zr8}lt>hg@EG5Z}=sLTq`pwVFwOKZg?hd9JT#1&%Ax#33qC<`%#v{QKb153t!mxsDJ zfYJRvn%}ZXHCCz3Z$i+2M_Caxz!I#cBHH_Fp;g5F>YQvwjlh?=>N=c%z(koXqg85) zxGxI(dB`DIQve?!@pz0!KLaJI3nF4o!;#Ndg-8Oi zP6u%nfmlT##%Ul%!k4mOBL#d-p_ruhmXqB{?H^%J{aLI`AItVWJbQhSV!<^SiCNti zxs6OP1U>IHF6dZoCqaiZOo9%7bRQO^NzexXA1>&Kd=D$t^>`9%u-guK|0n27XZ=sm z|8EQWN+#&bG(p$rD}SZ-_`fOdbeGmCcrcpPJc+}ZkycY3{xV5W6WcQ|&v)t-a!Jb} zg8Y6@w*L^5VHg4cL=6mgvIQFtgwgv~(kRYUg}|!W!sx^?6#FP9t2$1~%vWve+^W3DxKE|FoAYIR!wH={V*HHt#_~PwK{JWNgw~G&XA{$nPgSC<5 zrG|O_5#F#(TUo6nrJ%Tg8;S{iJ+W=sEf_~fIxz2t79Ot8-6tu$a#t#`{ zT}*5}C;}@H7~wKI>9Eyxtl2Tc>fK4Gh+bNA!5PL592?61%%-gS40~pCn^)!FV9t1) z5^55awK+H!`QxgK3Db>01(RXSZDbVOjEKCJCLc8#8T_TTjD|_d1nf(mlVmGBjsuSq zPGOBrL&7FZJvdo$499OSoMP|w7&_n=P=DW&_AdSZ9_#;T^#7OC|Lv^*u>>q^qRV56 z1sYo$U2QrGv=Im3=$cik$H3o;gb)XKt;Tx9bT|j#l%ua1^_PVhpcO%Kk8Gu9aiP4} z`T_P$QV*Uh$~s_&(?eaDYxUOhF66Ha`~d3QAz#`Q=apX%Dv9h0Aw${bdpE zx%Si<{7taBcCsD=6E-_Pv`f3~xs8qssK<2uhyMCJvcE**DfCwceujYW)JAP#{o7T3 z%jjl>2SF#H;tBlK<@c{Z6!I(VXvHF2hqxrbJ<4-pjUOImV7ReKljAd$gL|VNKS4hN zlyfi1v8;9Ce<8=SNIKF{K3tCRyQxsLUbA5XiE#zcgc$F^GEAfx8z9GAjK9NF2f1GF z{taSGN5=kx7*Fd~j6Z=Gf5OFhTo*AOPExu~mtjUlnjULy^1ZEz@Pgka!mqp+WvJ?o zAAY0!9*X3LUoF3Af@2+a2>b(h1o;bVu@GM@>(rd=OC25(+|M<^{mgxU3GNkIpZ}MF z`!Q%2Cb-`s_}>Zc=Mdb_e_3#skl^0*+XS~Sb~->Fy6d0cD6hvN`{!56Yv_LNR-9V= z@(EfiyBs$~HFg%?HtgV664eH755&@s#U*FEmE8|?8=UaIB&<4{|PAB0- zGGBrp2WNv0ki|oYeRPhK3-3{KM_RFQG(Z~s<18H1<~I1+pzt!UK+O2qrrc(J*QP9b z7r&u~A1=CligMe9u)&{TOL7uy@JG0N4`^cB3~ca3*xz0CgZv*w=bVt?l* z)>fPk(duG<+ic^V{7h%~1w?A%pUI#E*KZ>Ad#X(~z4;@A zmG@g)_gh`nn{65Rk?INkZOVLDXI z9NRYd{3yE4O8wU-tp6b2aG>zFCm0d-xCTAQ?ePcp+{0v#cLw!kr7d|+g~0r$-E_<2 zJ>Tl`Z5v;7$e9QyDmCatsnedJ&g<4bhvfYStd0NhXmI}raq4sE4x!>D{Dqhm88TN} zm7*vM<`ZdxLB$q0CHc&|OkYVIH6251z8!4rkj~Vci*cPeCADXKho6zouk6*Q!j@b| zTHGtR0z=W;2gr7lu!^OprTwk@(W9CV-d?E8g%9qkjfTf>ZN+8yaD;8JTiT5~+4({S5 zqkm^48bnt^5_PqWJ~ekax5-(L%WKdLxBrfHgFW|zBLzAW_Mp<1y{m%V$b-o=+bLOz;lmOCSgr(}c~H=Oa2C6J1$a^&yM+|sNj2_SylD+*9M~pY>KW8g z_|?avXiHsD)M^WMa^WhBfTO~$6d9qz+Oe*qp8jK0aJ)91-z`YCI;@4!U`PmqXL9<7(feR_lW}MMrBxF9Zdgu?j zypz7ntN8ANlWf3PvHt@sehzD+qaLC0jkaKd1TST1Z5(zA@2`3w8(S}sW2Lz8`>nc! zGA!o>SmT>@ zIX1*8$s6&irryIDOW{cj;E@Htu}qHdpEpMtHsDAmeu@Z}j*6%fXOjYrbp1uE2d{YN7d;164s+T>l z3VY?IJxVB=cYuA*!gQmkUie+ea}Xe2JCM2U{OWt%8NJTlNZ zdmxYa@ZVR!T0Zi#b4qgdcMl@(!QX)^KrXL(9@@au(|KhLl>Ro-A;`&yA|_h*IGt#o zh!Yf0Y$Z6e5>S^R3P8_%&l>VH71~IJK&CsNX88O2^F}oCEO$|s`N%@^C{NSYCDi^q zy!HMB%_8h`m$2_8@N|gYUD7+3_pL{M&LOOSq${wO;*(88H5_lLo98?DNH{$FzQYa> z!=O$_F+v@9KK2-W9%7U3L?uLJFu`h7<)>KT5dVt|{+clODC9J4FOug8xkJ`bl?H7 zrS~D?@9>@(#LE;@nN_^Zhtwd}_{XTs6DXsz2GegE{?Q^fbyMda%3}CO69`TFJj6gm z(=BGzzWy{`E!<>&D7E-J6p-{-fKPvPYY!s_2o;w%3Q{-Spx zi4V3ULZ}V&v!jvn{GZZ!`=zlE(rg)|V?wH4R>jEtv-D#5O`-fzznov)1#ZC=ib)(( z?MI$@XLQ1s;iLZUx8>LFI~V2q4RAAY4kbx#V`|echDb z)_r+n=ko0LY49tw9jVSCBwY23spsSHJ${H2y+*r|eP^hHG|P4?0Plzgn(9KTf-Fu! z9#Brjdja0~h80ma;B$efxVEsOt_}23Tpk|U!b8nGf<36sQ^Xku(+|NnMKMh&5PYls2=~=_G`K#7?q-R z^b@5-k7~{tOb?;46!kY2)uiqqxqvyMyOJXH5vPyk38X7xo~TSi&0;FP7vP;o4vNdS z0iO#*rD6-}7Nv>}^inE3JhX*}nt8~>Lk5O-1&dTFQhA6)DiwJ=#3Gf71w6zem5L2K z#3E5253xwp$3rYqsc7aQ7U|tUA^Imu)8Q^m24yOA_S6K6tV<{US7*cBQAgtszkh-8 z7yUjV-Iy_yRD9WkAPbx+s}u{z1Kt7G_A?R9s2nN(C@)H9$p3MjO?9RbThfoJs;S71 z8=bjxF`o{^GMga~a1G*XFk%d1xWCEm?fLiXs$!lm_5mhRh1&WH?0E_rt-8nra(iC4 z37?&%KhnNik(==bH{PA?`-}I5>U&HMuTRt8;a23MOPL8UjD!l-?E5B0GqUds2oksN zb^_Fy{@uW%`^w=jY{g55cU2HxQV8Bpl|K(JXkT+Uuu=l1+4t{=Jj}$s=MEzGB7jBM zcjqwPyJ7qiuJ5>Q4e2{|wi4<|KO{|aq?++bgwBT|3+g|rU2~2$k6?|h#Y@NUnjn6c zhVV-W;rBE4p95M$fOPvG1a!Qd?7!5-{_`@$R7SV|)C@+P=cvpRDD%tqKZD^PO(1mp z&p`Z){nYw9=s#@c{``u9V?U`e|7U;dMQ|4-?> z{mh;hxj;J2{#P(E|FZp04&{&f5BU|7;ZFn{jlj?etVRRHQR%F!=HR8X+6jmx%OYpL zd@oYDp#I^0a#;EJQ$OF2rSU%cI!(L22+PjjcAK8fXy+}u;muQtfNHs9E9<20UUa5%}dWi}>fJ*R849>CSXG{ za1xX08%=GzfZSAXPt+UXKk5B}u^pBs&Fvo({j(pYHR}WF4Cyl8@t6JsL>B;cnJQK|Xx~E?j4Pg9!#YcZ*2`uqg2br~Q1!dCaev z&OV#en@Qf#@PA?>U5Rd6n8P{Tc zEPA7nPVEcBs-75%dpqy2&nA^gF|Zl{th5OfO}|^%?+@b&!rFrX<>-&0`PmkFNr@*zehH&sV@Tb50@+&LZ9D!p~WiZ>IUGRj~wbUhJuOGm~+{TZDGAq zL@Dueictzv;F_44@LecnH{)f+$vWX>v@-D%guJFh_)Gu1rUSvRJ=zzlZ_qxqn@T$Q zANYMq_Itl@K+MNKq6Xqd5c5Km@%L&jF^ zQyqaSu)makX7mo!3qGx&>aRmK@M#Xw)n(p8xdk`<)~w5XGX>B@#XKMMS4+W*xI_D4 z#A2d2Emd7i${cPH{YvjYQ36+w*o|LJlIC8RlmBr+Z9TleDT8+phi zlrKV&P2aHO?8^`?lyO!I*Y&X5Qi_DB?-eQ2aV@n4N3k4Z3vo~I@#w5b{%6WeP8@<# zqSO<&h4!T{KQ{e>C!cPG3sQSevwV zEK-s`U@85^qW9|Q(};D9wQx!0`5LO(?qm2IpHn zOo%J1jp`R0cnkP%5Nu`b;WJ&_-{ZntBAZ)g9S>t73v zN6a7W2TY+HJFieMdloC7JR2`L@j419=9^euYAIDDXV0KW>9kn$b*h{=00D@A$TKeF z8Lvb}y8d9(Rt9s(@g|f2F-PH?^Y5p30C90aihSAB3;AS2jPo?LLxP~d7@0%en9akbg` zHWal>xZbS4O_~J7G7Era#~bVYJ#7*e2Bsi5H6GBs#ccKo`!I2oFSMS)a^$XxCme8< zofz-O0tk>nAomK2BmhQ2EG{sWqZBb;ZbJsUyTK+$IZQyqkJBlr756)O9Emo76QLdO z&mUuBP%VH~9Phd-$w06vlu59&MCqD%wv^)+LhTjh%i;3m9(1;3OiVIbbb>_GPpc=W zD^--I#f!NUSvvsr8rBZn0g1~)C4pnk=1cMO^z35Dq4?zuBvDIIE{?DP04ag6iO7#> z2mE@+az+sei)H=&eME0QpL3+eB18?)8VvePi>K@0XU7Mq`>4ONJS2`gK?3{$Is!Nb zO1~K^HP)y@jg9-;a!;)*$?{11GrkiZcp3?WpHTiVzLYhAjMkQ#ILCPzr(MV6T0g16 zu0J_1KCsi-;tIqqzZ3UkYjA6HEqB{`4ytsoHzv<0USaEQHSXPiUO;NjvK1HiS? z?;s4veM6Wb?(!dp2oXuEr_CBeM$q5gvOWU?8b=Z9y^K@g`i0*P=NRGkD0xQbclgm+ zWE>2FrnDZU@r=j^E{-1V7Mzol>YU%=mNrxpG2bG`@$1my%BpbbKhQ&OoABEc&hKz_ ziE*H(2V0!m0D^IQqy3&YzjgE~seeq%gL2QmMY z{5M+fpGFQov?KXKwi>2zmf%&L11AQ0a3r(`-LH$EIK$m$xH0!F!pL!#)wM33-@Q73 z7rK%PP2h!E*U`|d$iVKKrG`y}o<8XTB;}$}$Y+ z(BAaxhc5w8pq9=F!hb*Hk48Ze7bx4tFT*rh9rNEd11xm+X}qc@@#wNuivSaPh+uG@664OaqKbP*$z=Dq!(nDf00S@gUCxvC_{W`K< zhb!5$)QwK9IC+L+#M|_mjjAuB5zcFPVr}gH@qBpdCQ1@d{nk454eeg%--t9M-i|&% z{!;2Eda62JO`J5AAzsuvo0GquzXzpf+FTUIIy)(VI@9iyJU zX+P`Fv_C#EQ#RLL)1E0av+ZG}rhX?CfJOG3(VfQErQ7pk+T*;2FWpajPITIXL$w+K zm3i?4wY@>N=ol59qgxcP52HmNx8%0yYd}qQx0`+B@>&NnDon$~N$rBQ0&8x=-eLUY zjknJIbH|Kqd!&ChQM_(Xr~bJ*r+@19)1FJ{SLq+%Z2(@n2@!>E`b_oY3oIpkyn67b zx>cs1F34+Dxm5e_`{^*6lXG5?Z9Y{dIkoH_IS5DHdWYn=#^D9w{wk>JTOG7n`&J$$ zP_@e8FK!fjjB=8F)WF;XiIq+Qbr)Yd`Nx#;WB3)zt~ocd#t=7BNISD}3&15Um478S zT;?$zLKcfCB4|A;*GwM7WtGh3JHp2s=TBwo9}un#SNkvx5DPNAG^_ps(^1&hsGoKI zzDpHJc~mL23A?-}E!CwNN2mRA4KL>v7JRf6ieS*|(Kz6D)1|k|xi;yFEx551DSJB% zM>-tjnJIj#u#-yyvHLPZkYq9h8^E;F#Y>(c6HX5GAd^xC^G!PWLe&lpX9nYqI$e4& zo<&vE$~`S?zBfx|IHFAwLBm_>wy=C=UtgEYr~C9L6(*ho-6s9Q*&mT@!JgS46%@?4 zSdzy)mPuDjI?8@4P<@}I)l+V4sweCUpPt}nR zPS=k}qkGW2#kDv~VoTLrs(vWfr@r;Vb9}yFqxJ>!Ve?{E? z=rAgd`({0i@ODtA2OJ$=>LpV&g>?SJ?Hy zl<@VMc05xg{By#ZEBDf~jSxgGQw}k{)l$$)Kgh+UEr*goJK%>aC=X0Yd$w1bNe4d= z`ofg0BQ5f^PjwFOBQniX&d&)~oXsYo37s zt;$W^Q}(HQH8q;LFVuB60$Be1!MU!zG`VpN&8(jZLRTYwuXi^eOMls}^+dxYsW@ zeT?L+%7h3QRY@6D-*p~U9vM|0GpamhRC%0HwZUg4qn;}ThDeEAaT>0$U4P@1HXlz{ z-cOLR40nluI^=C#=Pu=fQ;GIt1H+k7c`3;B5$H(fKMFDE8Q76M12l=;fZ#S6(-NV@|2sjz%VQg!?_xUc9H{wI0QuG=sN2l zNTZ5&B@dC?8e=^+Eg_fP3x^1m3eKw4#;O#i#A$%#KPXL!*3mFT5nN9cfdjVnB%=~d zS#D;oFV~{jsN(o2Zk$9E>neGDdJQdkkH6XxRt{xMb{18B&rncb%BYQbh5>j!>HM7P z4CxFcl-37{yfR_D^-a`cJtZBM&rEhw(mTY{leERay4xtmVW75#@KiVW4|>h10|M1Y@n#mlM8-bK=0Yg^RQV2bNO zHYQu}#L)%yh@mG1q88jKQV@uW^|+hpeCY~Jn|cAVtgYY4IiXXyd-P6O%L zdk&ZIp*d0O z*uB%*k{{!o{ZgB@cIQ_g4%l)9x4{kx26N%fjE&_p?MjZ$GYyR&Si= zE)=%|%V`Fd3k@vWRRc9fJ)cO9$WNo5Kk2}g@U?0GaB4IMAIj)ISSH;znI!7;tMo_{ zHSf73B>j@V0P{E*C+n4enk1gWEpfAj04^qnY*Y8TT=)A?Qotb;ppkCQc&n*oA?ZC7 zmfz#wF<4B??-m17}kixW7scHOSaoNIg+cN>aOKnlqc1| z>BY&mbN+^57(RxRd+B%aJ6?TFN#uaq>Y1hCRea`SBoXzTpy3d^hdqx1$46JlE@dhL zU_GWu6-;i$s!H&NvMJ{I_937;ffks%-d<*4%k4M$D-u;K>0_Qzv?L#|_mke>bvU6; z^kl}4|}OabFe0kx8HiXrtf2~RNL!4eLc@GuDSk%v8`^^zQ6vJg1wKCv!1kx5M@8E**~b%Ax?8ypsldJ_MT23F-#OY<@cBEwl= z3XDu80g6tERP!k=>iJUgxSK7CQDs88&D$wU#KdAXS;l&ORju`yGI8^JaofgnGCw8y z8IjO7O_4&T>xz$xu9Up&z&{F_Y}Z4?ium~_-dM2xkyp|67OSvk6m7y7;4+oXe-lv= z&cPm)9h0W0_ox{d=EFTJoA?aOQmsy<;(ACo?<65pee1rexiYB`)f`3Q>0V%0GOsyz z6r-7y0$@}Z^Ne~PS*|hgV_IbE2B_C}XiG#^>+YrrMEfgt2&}^pLtgtU1WNH)B~QrO z&Qj3l06v_7$OVPL`e%cMT;G_Qe-fG2kf}D-EG@{-D{IJu$Pu`k)V@L`R~w>p{K1CR z)_cwY;!yp+?ik;?5}|?wn%8ol}gsbBbB4MdN#6sT>DAC{W)XEPT;h_$(cH;ze|%eU#5qLF-Kp zZX)v_@!bDV*8&cR8j+`w7d4;`IIzQzaKEWKTq5C7gtahN_xy8L4BQ z+aKu64R-R?aD!V2u_fs2*BO0c;_pKLBlpoKF4!yNx3p>>x3Tgn~^BoNm)Ln^z~ zbgININ|%t;EIub-$2_im0J$my$af5*edLh|;o;=F9-+fZz{4pw@WA* zFH`Hmj^&E-8h82ml|S@yCuf8GoM7DL$wr=#4IZBP?j**03xmUfp#G<2|L`hjoD4=SagC5zE>Z76{@+)mo!|D<5HY-QuqC zYqsXL$@s{g&0lae4iN8!p%OTcENBr4HNk zi@yQWLxxtTOZYE@ljWKHW@`8c(K3vtTPC#gav$Jr7dL>OQXZJ|=V-Hw*zLv@y* z#O@oG%(kbmBrKIoV$>-2m)BxO1dDJteNF3p_RKz{O8u2ouhRrw-0k`hN*ukcNRpX|_q%>PGkd9Vw(4&D&vVh-d5dyNGAMk_6W3mSbs>*#d}p3c-px z4LHk4vA$xshWMjpSAMlB@q9tPn@$SYt^x`T*i}J$ z>~7|;SY-{Rin8Kc_)GFEAK!_BgB7xr+HFE~WE20BeaxN-+B=;%`^ZUjgp&`<+3r z;a49_N&`M!0Dti>2Jm74Pn$yLw?ExK;!_aChLpOB;U0{+Ze6m<+5+xlMUAnhsA*y=Bsx~=MU{X$$;MojEXM?@CzW6yWKSx1&z zhu0%#RPgl;d9CF2fEicuy8YLkB?sX3TkWbCa!(#hx{?`Zk?wJ_?JFg`%eb=Inz#O> z8XVq35)l2Aq?Dux@0%fyWMA3=aSbJ2hW=d;mp3*#54>tfq)_>^|FNlPOTqn&1D+xcfqD4t;EL-a&y}MG31KQ|5l+mB8wcF^|)H zjSt=w;>abXTJLPgry1;6pe#Lm zyhz?>)mrnmFLE7}Zt@%FV>6(+9&63dS0_srd?RCgHfQGg_92J9i`jFsU_>S~voam7 znI@MsdusAO9K(lX6(Y5;QAecyO3kN^#+4FP5Izb60QP)6L&=C0kVG;)zNH$-iCdBF zkwZj;0s^N`)oM7MM(2LoC*#TboDI)KuBtydeRwdHi2;M>OA48Bg5Ui_%KZe}U%O`? z?OpwTNvM9;V)ql@)E@Me+A*O^LF|%3^L5sTSwhJ;x^OsbcKn7cyc2&@YtJiz&8Sx> zfO8C?>xBVe06LR}#he=Eu5d0@t||du5p7(`rcD&ER0Y!ETWAmXdqbj9BTHHz8)4#VC#VBzkX)I4pcIk?r7ccPS^j%R<)tfg$V4VF-6({P*-iO3Bir9bL}5 z9Hy`(;KkC}?0l$Y<3;d^yv1$woJpX}8m9YQ$gBP>sSXBQ)_12tTCK=9u^ugtq>;8r zz_lwsJSR;YQzeBtVfCGGYv8`Yz^xv`pM4UgoSwhy61}K9yPgtzdQG3N{@9ETdqSB# zp*UpUyqGFNvZ@zlh+J#Wv?%uV;r!glZFx()sYQRI zgrqx2WY8+w=|qS)o9=)#UG=1`4p|&PP{^X;0%?9+wX8PB-Lm~5{HiW-TvHZ|JiS)RtdC87O{Tsv znOy(X`VxUOr2nQq=x5am;81_i(qEep-T|ie4Vg0jtF>Q~$=SK~>?!%=!A>6?O~ukj zLwTx7ek!&mU(MhnZBIzIp}J%IW1v#eDoUP++(^#tP$!J#zN$-mY;2G|oP;;`o}n$t z9>yLWVl}j|ml4MOSyRxH-ku*0X`vFx3v?w_Qv^#mK zU-P3S>+Im(&-`6$-zwd%&pGPRcRO#~(T=E&I3K8ZP8@RS@wdsoOK8Ps-zCE@*#Eg; z^-D9m@w(K!j|`fvzOYI^)VS3N_IzjGLW>x0&2#$QDU(d>|*_+zkx;Al)q zvN%X+jMcp(b%zW@xnu-eYYsNN3NDQCM6yeF;B7#_gh;FuM-Px?z%t ze-i}hV{vWRu_{1jHG?q)vPfEp!!4iKne@JRHkjN?oBj zGu*a{%{k$~HT$en=pC6Y^y$|FH5=Hb4(F+k=10Sm+|Ws0m@xinnF8coK!12#tjDXf z1cU{uQmUm(X*uUW;;C~>Dz@tFJK4z9`~`lap5-U0a@I!^#tT^;0$H6cWaVn0ILK;s z#a8v^IY{=h0hlgfu9OhvM}v@jSNMeh!t`@sYCLDL%mIr$`6dV6!#PoW2W9>sl%-Nf zKMiGeKGf$Ig4WAk>kDE2&0D>z1PNiUSo@9$SRtp2Hp18FqKcQ~U;+K{zVyfLpzeYYEZ%otCbv&!Ql2mfxx-E^;wQN=vsfpf+aDiYCbY#l{Zi*y;yjD>({_b? zY2I{Te6)BUE)bTR)(_gQy6ksKDRXk~w=|95JpBH<9Pr`|qkg#lH?!a6L`z*_F7ju3 zeMSD2oxe}c|9)TR?;~=)JLf4}4VgsRhkz<24X8ELmFUJ>MjkXPYsSAlYM=-sV+M*O zqS@Fkb#y>WBJXK?rv30E_`9>-kIv!X$}ISVJ)u|3*R8O6RQZgbN^fo)&B{W%P7%q# zILdpG^&2w6izc~vQRx3_pnBuX17r^G{}l^8PAZ+cSMD)7Eu(*{K3gBxngw&(75Pk$ zR|(Ba9;Wq$QrFegWy&-)#sjNAp+4wZ_kLwi+7Z%zVma}`tTK6c?jm3H_xlvDy*5}GbaFFAwOaRRk4 zWbJm}GMM2G`(I|Y2AD{=PQKV5yM8Yg+yZaV9>LLuRQTAC#h!Ex38yfr9mqTaH-*aq zZzM@El1-mSutRYC?(M<_sXH!p zTie_ZrR3H=Ct^$W=kC#;Cwu1OgZiu21Y+kEM()>*HytH;K3FaB5ou?YjsqF2obkB>`~>C!Ia1KfL-Ru!P|=^ zXCaKQD!aRs@Jb+f?sxf2lV7m}nCBlf)}c;v02hf0+aPDJF#mzQv>%=cMpf`}@oipxh?S za4AJJ+EjTWX)3nj;MU!A88Og8J4RH3I|c+Q!%d_$3c<{HGDF&5Jk~ySJK7>cms7Ii zt@9+4_QvY9C(<#YUfiA+sNOX5K*1K_+UmE%KWf>i!2!l=elNoK*Xrj!IU5nMcq{q5fBwV~MM<%QN3ck_*mp2S}m7vAVR&L&G6Pb5FxdxrX0l2%8MoNtrL}MzZoYe@mH3GHv*9=f3)buIda#UhK2< zJaH@O1E?#!oENTG@0B~%jtCmhkL+v&Ew^*rTpt-mn7=p}^KE3a=O=}DqJEBSvkC`s zd6{Fs6o}XCra(&kDW@kIc5|-VyvHS$=raOVl~bbJ#H5$<(KRJ@5n9!!j0Ln8+AGr$-V_H2t||3d^?kgXb`b34xPnvXBUy`&5k8e^ zj+Sc&ElZ9uB6@4Y9HhfozQ3lXN+f*q4E@}u8l*DOe=Ogh{zJ=id;Rv<62E9O9Zs} z+F?Of*(9`vAPKE)uI<0MwtA}!?@OVt&D8c9&I2g&RGyseF;mx5Qc9H;N3+7=*QS)O zeaH>{nMpSWs&`94SZ((2(00t$1yayzEe5CQL9a*b)0i?SvW%TFOOCT=;jIp6c@?b{ ztnxEM@3kC86#YVL_yV7ObS(}d5s7OnfH2LiaMj?mFYFcUzb1%`dLZFa!m?VgST8x( zhx>5dkCtDo&wSMv>jnD^>R^9tQzXgalO*WSvI;Xk@iIZ){ZAMFR0XBA#{nvrw&rGf(fG>^T z{oyaeFUHHW9{WFE3Fjum8Oz!=>e5#Kf>TYBM)?fGpBu;pN}rj zlYgM}Nhxk^Xr;gP3e2}~_2%u(>%u-SP8*(LT1*k~PV*~ad~tYVfi5~qM+_h$+S*k| zNG?g#6OZ$|%e+?WjE9r1IxemVU~canyRi^|C@kmN#We~ZAOM(i_TnbO(H~&{ih|Vf0{lNO&vx}VHM5@E@A_%S zDL?eR(|Rqvo?4#C#Cpp0K;}&=JOlRAq6AcsijV>? z%Dm+j_}NHZp!zXIQLx^EdW$$mmAaXr%mbBYX)B8K{GGP9Mhh35KwGV@)`Su`fcCeV z94I*s(uKq^1{PbvpXq9F^I-9cgMhD9tcD7+JJMPHB;zHg{KR?tFaIxIJ?T5;SL{>% zknbx$y0`0$!vZ!W6Z8Cmjd_%6iEN$lA#RZG6-)89BHP8|XaCkrnb z;?$VZb)yGjQzaX;rKyf&OLAG0lNgukO?vgqN=f9ps&ip`N9e*duUGI7LD}#B zh;r!W?EIlFIyswY0~wqNVGTh6pd0`?>-QFXBt*zi*A6b&R>O+@>%mzo_Mknv9Ei6@ z;2R&PT0P^m1uY`IjdRQAVv6qLPy_yX%ID&(tZS{^P{wU=jZ)pQr)p@JJMhnh>Ii*N ziS~Ozxa~9d8m^;u59GqkiJPu;pAR#OrU8p*Nf1I9pLC4Q>rs&2m0jtCr-RXY^C97R(IvN2|GkZ$Ud; zK25ysML%rx+H=bru=AEYf!OUrx9ZPOqZe;Xy4BL0X*6f09DbG=@!V6K7VY(>UItN{ zPBe(p&iT3lvitTo0W@USmgBt*b(zpJ%K*e1cT*c*@T*p0&+i_n7yoO|a|f79+7j$K zw|tu2>$fX(E4Mek-4FX4_aB~{xt5D>)>yrM8>|kOm&j^?b&@^SkUAci#CpM3UJ|U{ z89p=+BVK>MfbSzql09m93-O&fb1aI=+Vavs+BX)69T>2BdO`Ov);O#iW|SmdK`UHd zCO-oa0m(RQ-Pr?CjO;Cxbva0J-%+74IJunhg09q$6)47I1MY;nQ2p`H?G08>E*}`i zI#h<>7z1o+&V0xR4L1X76blz$d6@t=Y~84VU4quV<&B`ps900u%Yt^3i2%xLxu*(~ zUE!p9BTEF5+aUO0+@v9%`*#Kv2%gN2Z)vhh_<=J+2I&{8S0i*&Omm*Y=s za(Rhqb}5h)3IXU=HV>iAiHqr5HH6;J5{A(EW8*bpe5I-?a!5TfSSZ0dPV%g0INRi^ zh3ewo27!_1bmuwEc}{hnlbq*x=NWLGHO{ljc@A@)1D$7?^DK3qCC;P?Jqil?`Smz6IHdZ$Vi$L1{Lao%j}HC%y&3 zK;$pFyC^)EL(q#`YIu{mZre$a2kV35nIUWp2rExnEHbQE6h8oy)Z8Rf4yv z`=Gm=@uTHeCJd%CxgQEk6v8hW8g)p=HU(4%k;e_mQ zHRvncO?OgnP;(|xa-a`rH%h`{bWGiA0k@*VYhM`f+Oum#8BqO-=w4=zC(M@3r}&8l zsPkCFX>hXeP)PMT#gPMi)g!yh*c{2YqUoC>?{k-!SS`Q@%3$PWOxk5hpdAepD*Du$ z8aKJN`m->{30*fHCx{c_|9U2dmXiV07^`PQjKnPob$$Il)Z z-QC6Aq>tI{E{yaFRnIO7pTji~IDr#pIleUMV-At{f#Ion@fTC2|8_br*83yQv8LSu z_8v;7p(+!^B=G_zjCgbj`ElWw%|8+wsBxvqGjxnKx>&yrc2W-{b=f|thb6l^sbPxa zhI!$@T!p=Ug;17UgC-N8&qAB_4wJ@()A|=J%2|%(?kAf5hePM}{|TA?Ps>+#=p?K) z=RhKFsqUmmuPASWG93Y80YRD3-yN3qf981dg(DGaA=Wt`0FJ_(PethOY_u~@= zfxfx=vzjHMNzAh-llTfE*gv)>h_~3Ab+i_4LMGv5>4ZA6ipaFS$&q(5^`D+jsSYKT zYyi$E%@jN+Tksd~Xen%e{#Q{`m7uUlwc6tvs#m*1tF6%u%$B7>K?s*j*38?Zok`=y zQjF3?CE>VqEv1*(xr$e*rw8iw&jEA_!;*1+&~4J{dApzLNe`;|d^Y0`AoA9uNJgWl ziU!BAe-Qto4OgRutT9^1O9S>b0hWOp`aL{jrW`qbI;t z7=zmyS&B;|+jaXfGQ@>9w%B^Sy|_q|m0&W_4F3#THAo9J#iGp)lu{#iW42t5BzWKw?ErIn_t_9OoqNhzoqFjtq*~}24$zx z-E=c3^P=;Fg=)hKZ}sSM_st8470EJ!v=FSH1)+%s7T&wlvC#C2xLC294o_!hmq7I9 z)z1t2oq}E#523iuv-@mG7MuO@OGI)B52~J7?ASw8&*>gf35&Y435HbIjSABxcCNS$ z!L&G2@fNYgSYvE4sPRH-Toa;3h^#|M?06*E-1$eU?WUEER2#;Nt_CN<;lr_5+Me3s zO^wDNBZqHwqR-6u7Okr>oIMP_6R_B9;fRl2xw&83T(%<3k0xXk_UDAPno}PeQT8X&iv(N{z8dg zmQmvG#L7(ClL0S0(a8RtW>}v+7SP(6Veuzy^zJghI(qk@ed-wG(~2Os0XH z0sK*Ce$x4!0oEI={ZHuq<)gFtHN9WUB$%f6j6O7zNT!rx6(CJkF?I%TS^2~GH~sha zB~M3XDEGMITr2mizNCC6m#OXxmrU&8i`-W&Mn zd(2DL8uOBsLSYoYfAf<6zC8)@f|!#CeMJ)AYff^~f6kob;Pia?zhX}UOsUBKd3%!Y z7NqS-P7}!_=IMX4Pyx0;Y5);GU{BJGg!|Z&dt=!lIU z@<`j0ymhSb+>AZRQj_9KNg)y*D$-}16rJozW|@?4NJ__^`D3?(9-rK?>6e@Y2Y1ulGHJ}d1V=U zl2s;6Qc7{`Nw$*4u_qBng0fMTXHT*~_pi(d8F?h2O~g9clhkLw2kXTQGA$di8_ax} zmX7{&HYJAxr)U$-1UPL|QYJPfe+Iby*pyr+`ha|!l2>oixEL<&bZkmK?=PZg+NR`j zli*ZI;MkPBWD+gvgN-?CbWHxN^<%) zEiW1W#{XOPC9fm${a3fq)kQfBy-&@*>j z7=dkoeNM4`9tQ)+UWh=Rni_W*|fguTcAS$hUx`XAae{NDzz z{r`pi#pqHIz>Pi6|NreTmK>T{KZv>^JAa$;;)?v>_fGZ~b%~Feo6M44^0WSk^*wPm zHNe_Jhr`-po=3OKwodOIJNM#t=qD;%cLX6?PtpObcr zFpxp3I;2pmEm;4pT1C+6im&A&wiXz+vz4zZ3eA=qSe)B`8&7Y z*z>6;exxgr)%(H0`qQK_bNfov7Q7L3U|k01r9~_BzE&HRDWers2<;sp9I|xeXEv&9?>tz_KvW3 z&w59$ zY-`Q-cda#?L$~PKs@HH$+&Qs6Cq_OZ5E}GJbWhhA6UW5PAHo$WD)`lwF|qJ<1&f{Z zV`C#uWS6Ed-{u#OwMJYMD*Pl68*x~WR~_t*8;=o3qh%IGAoFol#6=Tx9D{J^3WoUEB3rS4|4rR3R9V z*yluC&9+a=Gnw-?_M9^H6y56d%^^S0eN%c7ee+W=Mc=ebad!6RMVNS)_)K%hp#b_sFu=p3z78ZkzfsPi+bJP2@cdZzYAGz0GP|5~E3ynU5TJ zWxrj3?U4ocvIY(8HIo4LZUgL5f+TyUhERRoTMFK(X)`mNvgb$6pP;X3j*Ut+w}s2p zP>nV`0al($xlE7NM%n*Bn0UH?1^j|{k{A>c7!mU*vO{{;YRDJ)h5}0cVg;jR0c3XBx7O%N>mS^k3Rv zk+ENV**QGLkvckDj}9@9t+ngflbF|`E9Ds97l&y?<4Bc*k00X|>0Kh&IQ1P1tH5~> zI*L~HAb>fBWmCS<>izXiOYpTAF#-26_Z{y1h@?O z=a`k}+C$2Ik*MT^JyOk^bR3FAVXf90ZM~WHRFXL4P{=D!9?Ioca)(pEn%E(STG^?%sYV#g@X%VDcqNamT2YE-&(#U&pBFMYJAa6cR2-I)Ir1DKh zz@M}u( zN{Eva(WAB;sUh+@zM0-JRq83@EUGljG<-M$J6Z7Y#^nMSQpjG*<8C05MoAkvY%IZL z1oefBow(5V(kFd_KhbXmpSo#s(l>-%LmoOO_Y`z~1v)P$B$%Yecx~<-+JT$9sYc%&>cG%8LHonL zOuuF6kNW@}jE{Ff2mk`KCszT!Bb`ESCDtv&h^K5ZIL3Wm^@h2BMLnOY2Vdh8a9i}|`*ZNUa1+rOlWu=kV04U2ZK~WFu^In~G4Smx}^h-M7nZtgZIpO)#ET3^FbwDHm#4A-pxPpA_JH+&OmlJAa9t7wA5Log5UKuBraronJW&Wf1HYKzuv3cth|VHcUwsLe5;lTrQLyg8 zePZD1_6sIXWG;~t?q{(%RaUqu);(C=9$D3bQ}T>+vBzf!4qj8QP(<>NrvLn{wsv-A z)03{vc2LSlD-<+L{r44JTiAqV#3k=H18?TxvUoT}@gS(dpa z=zX8~Bz{MAbl1T2k~7|8a3jW^7>q1rT~U%8Cly>PJka)x1{`%UfScS6lnjFM3HP3Z zg`9`u*{7JhFKyR1b#fM*(rT>%pAZgNBg#XV1F`4g`HJ^W*}nz6{f<|V*&)eem8%ca z$XpAjql`z0RDUOzgUnk1idJ_YpGD>~K&*$mxEK#&u_w4HB#djo9qctqecTV_ZrTCz z0eQUC!w%*E>bzI1D`J&HNUi=z)A(FrK6{@bbpa;#_UW8j%ju7=R0?zf&Lz4p#Plp^ zy%BjcEA|4PJsq>WO;RA@zkNEQve<0|h!EiBQ?iVKYGb>Gy`h*A6(@&hFTm@4^PCK^Vd;;Vic2 zTvDjZi8H|s-Yh&`a53r- zxw6Ub`wE_JlfBIN1=?99s+az72}s-;Notu;4X3kF&6*p~ZZkA!ZPdj)+*6C7@F%HX z)^DDBD3T7mt*0iMJ0vfDjEPh~(a6?|n{#Oso$_iZOEk9%5^T>1$<8cQCaufiUvmCK zO{6*i16PqxNL%Wpr2%A}QmiU-zsFr4U5srTe>mt&q=UBSGlIGU>JlkXlVfjT_P>}K z-L&IZ*Haf0{1L!au}j=vr4RIr;9>YrW_{q~xx&fwFIvj6Ia#rMrtx$sS@PQ>_!8eW zbWD#5?xWYHJ*Sh*`1COP0Jf2F#UZ zk|6GHF_YZ?&iNsAvBho z-6}U;CkWc6ZU*VJB0$tn&oWVW2&<5B_2D5RiGA5}68Rh}lzF<3S_7P53AlZD@6gp` zU`Y-mJ$>7&5Q>?1fG&r9!!OSzLmo0CUym zD(qSdTC^k=fh`HX>-C*_@5vF)iLDiwgubu-bfDw-L!e$*2GoGCdJ-VKE~7{0r{>mL zE9q{&TQCr-44oxtoY$^KkW&i10o)z}MwAPflSiuqBwx&vycP-v*Urqz&0K!~3hiSg z@gy^!~c~4>!jf8-&Kk#ur9T=o8_F!nWv2nd$ zTxr!>D{FX&diWv1qpTx1&8{BhMg0}9t>$vRYc8q&EX|0G8VFiTbtY}%t9xY{?-g6q zbRcH76765Ce^=-v1D!~HflpHG0_>I2JNSW?^o;Z$(LS{dxYP4#t*v3DapDJ}Zh0WO zQYwO4z6hU|NOB)W{&>-8?3L2_lqwBVcCnsWwZ#0CT%ciVBVcZVFc!q#MSaRyXEklb z#&^SBMtYMRQFX?9)7FMQ0e4FqW~9v{o-C*-DCpmwJUly|+%4a zN3Seb^Ihsp_rdPxdE0PBY3e|sd_M-9=y^k0Ao8Ajg=JZXlep^8F zBHF(Kkqt)$-7RcA_t^d&Mp?cEnP&B*KCipwThpK}ra{N~79A@xa;lB2;w53_cpzhD zP5ub{rNccl@w@y?nY4|Ll6DkC`VtayD~KGns4M>0dk8Za108936^p&KAjtiTHBXWT zlJOOP_7v!6Fil*R4m73%OVfdc?&f!Jshunf*b^59>Yq!o2{3V?Z{gsBtvx~z8F|)k zeP?ZCRgRy-70~`NoF~pbncIcD(fG;1`mX}3-$z)hTP!dw5cCQ+`UeUMTuZJH>XoK& zeNCwTJHPeO+3uFX!~M-W+)Z;yLMKP*qa|p&vtmDYrFWZ4{#Hn?4}`z?maW|AG$twb3GMd*Xq9G1)3SSI}j^s45Tm0 z><*?wjlp_~?|yJ}&zX_#kQm@hqIJmw37ktHVAZYxuroDadHq2jER|URI{UJswR*49 z;)xLOF8|&5z&Mc*=hUXMFrZ^s>$SncbwwBfwd!TgQk^4FPBM{4J7=^qcN0NU#{KAi?Jii0`;$?FzF*;N1(N$ zS2W6@ucZ~O9EeR*b)&nvRs)dJbZ8ods&0Ct0c4OQ5mpG@I%M6L9IBq_nm2{SJa=6w z9kE(n1YcPpgNynAz~2Zx%T&ae6&i>5q4C5G+%U$+WiqkZkga@xyu;Y}%@gk3nNu&I zbhTF!O74l|2G0@>5BQ!Omr0Hn$dNeS)Fp&~>Oin39ZZjdC~m3+qIgl8bgEoRubFtQ zeSd%!gfHd3Tc*_$q^Js}L>aE1GIi&JCrhV#)I9R_PZT2nC4P;NCuln} zVj=pV3u0YlVU33M~V)w!e_K2s;Z2?Taun5Wui9)1ng5p5;zTM;=R3vh83-m0f?cbHScbr7BMc=H8u?Z zDuI@XOMG+K&YgHPuX^n~Y(19@q|)T@koB*S^)1rAH#VtPp#F3C9m>g-@)3h5b-PUG zf~8+*r`Vt6O8e3XZsUa{}69j#C0P-%|2^u51H=Cup&qlg?7FE%Hslwg# z0pKS-p!Mfiea_InsYUo5qo+H+X2Zk6o=&w?mR>GJOZP}cm+w=NhKasu-ll25wMG_% z&8?>UQFG8V({~I5DlR%BIhhu4FJlP+W-%kc)wA92SZ#x>oFO-NFiE7rILsf z4iVAH?~5N?$CJxTW=ZneEgCcih5#|ok1 ze0e`yWX69mkh$TC+;z*5bppViUyzLDKOX>oKl@T>7A~q0v!AjG>M85mbXkUBBu~^s z+6)hJJA6bWsCNw8knW@-m*OTdEwTt*hkZ!Nf=S0r`7+9G1$)vV=j&+Cuf8Cz%h!6O zLWWx8%q~3=LrLY70kCETl{i9Y4K4ExdRvd4Skd<2>i3F9THTM~u8(8T3Fy`dHWDGy zhOE8n-R}x>*9I|9%T&YI8|gr&K{~?-o#6*C^q{oj9D3c!l@MLSelU51q&r5aLwd#5 zct~e?6*dVX_mgV?xsv1d|LqGvPM)%#OsnO?k^9edCRrJS5L(lgoRydENDYo8YUQLqUntQtbX%tAzU*RsE%_2a|atyooLNo zDFi4xN~c1*qVexmD2Wih3njo<+GBDF+2|6~3A+nrNgOU_;HVR+z+NfqB{dhy(C#M} ztlh%!$UWoJlT<8o)vr>du2Nz8QEb{`m4AbUY7go%!OWwk#GX$x%}x|k>~f~gkq8~X z;s4M4??qJW%YS;k8nOip&;Qf?VdZUl3ok!M#sV4Pa{woeFDzm z>kuZ!@vgoSq*|``f=o-FaG3|;4#Mo}=kHIW&0g?P2RYa`@`|tjZ;=Qqo8o7qL5 z!6==3RG0spT>%HAauu7-jbnjN-3U4Fu)tXY!dv zJ?L?`mqul_57l>&RnGb%PoFZLgHD`Okv%iS6v4bW zO;pQdHkUKXGSkZKOYu=<{6bfA2BuRDQ#YGbRXUZN&Weu;IH|@Rvd^+kM?JEPhw5T7Ete=V zRmG#N1m!Ow`v~Hvr6Le*8|Z8s3?Mw-yAmc*kUWBLgLfsYmrFDQ3)+?v@UCP8!DxdM7c|$%r1Q0hY$e1v*XNS=K;*`ies^Fn99UnohOydR&UD)Zp^eLhtS^?X?T?aVj0;cULCR%mnstm|bOp3N% z$b1y*ec5Rgd1FOKM|Y2#TdFF_ zmEoz6GLcA1yejvV(qNKIfqx{{SNM7Ko0_@h%9WeGi7&VXKVB1TMxUeJ2F_JwR4=)w zk|x!*tIZwxK)Y5F*qW~f$TyXbw^m8gN|MsnK5~XFZ(}jh|8pUgF7De72VLg; zAA6GRmVfOEgFk-Fl05mB}ookG*U7xx(=U&XoTAI%N1p+k5F6yJ+1Y$;qAwE{a*cT;#WaeYFI_Db~Nr@nFDm4XD>w@(@j=oo~n|qJCmqZ!N z9L49vsUS`CDYhTYV5p-SX~fI;@OQYI4>ChOcP}=}KV-ZI?9*i@shjLi)FpoXK`JGO z8=C;z@iz`Xu=~~89HOLOWYgsGi6Zg5rQZ9DKF-|$sUve9|H&zz4b%&9PFI(x(lwZE zUj04hdG=sU*)6a~wd519!_{Rb>S>9(*+gwLQ7a_s1{3v96IDqY)npU(nu!`IQ9%>+ zmWjH7sJcWYahW}4sh{~J>UpV#=`So-!XGpVabhS)eVXK{(X=~R`@*&VX=A?J24Ik0>xPx*iNXip_E;Hsdgyve?b2XX-=W-+5_qqo$1_$}& zxt#x{{4Wl~<}Fl*(x-3(Zh7}S!f;9s7Tma)OCxAu`#wWdZ46~&EVQs?Jb;Pv0$%V6 zIFNcHc?>{^_WC`o75S9Vxqc$FqJS-^Gy^TQ=nckQBe~$LZaGC)It+gEm6x&RLn%7 zGb>Q{nW&$eD4eO`uiix6Wuk^j)NB)VuZi+V)a54XcP8o#i8|Lr{mDd~E>UNisK1&h z{L2-n6HU}|6NR^J?hrIlkC`a^8L`u6qMkBQV3t4tI(XB4PyCTgvTs)S*v z7fjT86LqpgJ!zs|G*M?s)Spb$W)n3+qV6qw@J znE)<(4SnAqDw2xFHNZ$>X}j+as3dniYo7(P3Lm8YO!0u+Pc1gYx#>J4oH7PST2QJ> z3}&|OEN{umRy=vl%ErSAe`m_5nh%Y~2qeRRBl=;ppVCdpmlBkB_Ekd6Al&`wAI9ZW^Zp6Z__>MDsE zk_Y>AnkV?GOU(a(ah&1bb&2cq-UIeob%`4&26@J$zh331|8d?smN|BhQ)sz`-)+qv z^5=gk?o4us{2=AYdlzcVeeah0ejuWN6|YNt^Zxhn*VDn_uww;>bqOVj^5{XszgZWU zsjopd$JC!EAN#l_4p)MDc9R2isV;Mm!uqn<{kS{2X9&&%Q*kvLrf9XTkhLuPgYMWp z1iXXdR%bki91(_K$^4`#jm&7Va6xE-CaIBIM_e2jI#+2$4bqBOb9Fl1G*yy|$ z3h)7#f@EJJ8m%Ltc0!a%k*v)YD;KY3B4jZVtK5JAgV^vk0+L)?$&H5*J6~XJV-Vy^ zuyZIQhn@ug3v=*cr}14O-MTM-XH9fqU19`%in&akMf%2hiwnXhi2`>VZ;a+1626LXvJ!e$kI}}QGS8ASd#T^%$9B_L z{#qRg7cyAh;BNLJtH5f_s)VKoEY|{wV3Bu(NDWe+krqn0 zU-p2vg#Sg9aMY%EX?SyMLjd)t3SeN5IsFV&0t#@Vzg=4Az)) zU=6s4n5L^j11qbf6E)JUB6dI%Iw8sBi?YeOr0BrnCJC#s(`3i1iNI;J5br2Yu|mMW2z0K2zR6G@C_>$tw!3 zlW|dOY$X%>P!{u2er*QlwFR(_hrZ+?rmgHTd#R71FFE@d@;CB91IZDFISS^(=Z&^FbW_7Ouic{i|8?pAU22D5&033s zZ~hRc6tvuf-kEhK_deAYYLmAOfbJXguGi9)L>|%y!6?=A?oY@YF3WcBvA~n`dgHgG z@t0T+uKqjS{nyu>?*66I+fUVIdixKs$25NIw=?*eq*L@xF!855`&VGkX|(ipiK>-| z_$}G4&Oqw)^jGS1xB^MC9c?<|3@S=jI+QTd=axth_}KWYa=$DskmT|AY=4)b-S=9? z7OrI>ou&fhpbPZ%bnYe;Zw0~FGv%5CtZOPSBnf6V&y*JtxYE0NUGbHE>(TNqyoF+q z>T%#qaJ$rEV1ms}7(?rkCRwR$m!g~Wn1HdnoBk#gkVEI%7a~Q;pM=vbrW8i0kXkc^ z38Of48$3Iuo&V&J&n{D@LbIjLVFIf)`YC>>S4hfnWm;QRgj4d z@!*2ER0!>CQMU-F>EZh%l`(w9O8XWz8v)~R_7YpLg%^sClQd`k%;dUlg0wn(^$FkVdk?V0R8Q>jc8Jx!&*?@y&in@Z2q=}TN!b{9M3 zq5k$+9PU04AR99U97O@b^)wPA$HEa3uWAa0QT>Jz1*YT4zPwNr2XDi2sOmRZvj~36 z-Vo_-d$KN5+~42Q@}7E*gdEA|sEWhfmheGdq@7CBA@~9xdk1B9h zChC{E6lfLwgmb7gN8Zbwze>>|q$kf|RORr|?*h6bZZD(Q8!48KIFkm)qrwL0Pii+4 zZZGn{k9+eGooM(-(V-t}KRtzkX9mUatKMNBT1T!Xw|t>#)>yH^){P&e;fq zzVSqprRES6LTpXvdj?7X=ZCh4^|x^84@8=ONhd3D?ZQ?==&yBFH#^!$lSvv&XZ;mf zqfbjLQo`@~g$_Joq<|=$crDw=i%bc`Op#@7>&c^bV}QB^K_kK+9Y(Ob;;-WR>y zsU!{9J6kijP;&*_bjoMsN{Y9}wtt#YvY^f3^Us2K87$pst8B5nt{xTklDA@!&ABF8 z=;()Y&RlP>4sn=iq=O(^}N2N1Gss-wX!~NBA=4AkBB%2kg2)#Cj-@W5T4I2V;8b0 z{JJ;hD}Ph=Y;JBMA8`ZR%_pFY$>2ksN(DkKEjOjx^Ytj*9{VWTGg81ec;&MMg&5>7 z?!QgPn2u_}Y`Nem4E+kcE0`4-YoXgzl%5xmGHw1?4^G#Uo3d@50)?;?-7uN>LwaGuL1H9o4?n}*wc!P!K7epG&)5aFdH?P0xV!Q zsy7_WWhxtODmyd>%zh4-hYFafTc_7#3F2Ughu+fD)JcTt)GZy^27VyeGy_8Y)8TH# zE>Qa=wWNFbp;w(wcv)Js9-@kj)SYm^k)&Knsp-+@ZaM`cfONh)$VZ8jNK` z14dATkzJspy-pv`Y*Uvqb~~@nv+GOSbuF2rRRxiH(U#}0H47bR0rN$#26GC>ThnVz zx5h!`x8j_Z6{=oquEID6W+-&}s04G?nlHSPS!;?wpD#~dfbR)8^%;mgBD^X3v>xDE zm462a64j>X5duuagTbx#aylfcCt=i>5XRR|s>%cb`%dXMvOH|E?9uG2@;nDpoP~Qf z=r4K^yp^wJ5u9Dm$o>jaLuJ35ERSciERzC3*NMXTHv26eNwj%f;t0&pDJu$BY5?BsO0u zwQ&z$Uoqr8GG)UM79# zQZx7@bMoXgbXO4p#cAl?rZ6pteXLG!pemySWNj^(kU2nqnl~hl&_#Hrm{DR&opFDM zbekw}^Aop)Vpr)C(Ed*T05Ui}th?Zt6VW@utwDQUDO7egC98Y%%*cp9@cURjzY%Ed zc_r!r6L4B}uX)qfUoQ10Sc|mr7Gg1?Pq!d)XQCe91b<~TNQQxK83a&HP03REq6diR zH-cp5%d2oM2+ufz__M@0ZA=_aSw_DrnC%lVgcdo>9z86&eXl;k!bJoJt+vJuLqoP- zdX+uOptTVTzo0nI`A$=wSZ@ax%quWtD`zphyZn%CFQA!MBhb*rVp4gTaL{<0AUuc~ z-hG=4d1?0wo{Y7h972v6I)~c9PGhZg#Zsu^c48pEWpRHy=_Ga`N8cO0>kcRw6Z4%8 z11>6O)w-3ly`m(pjrkYWGXH5Uy}C|_+pcS@9rSs0UV8!VYrfiQz#B+qXXwgg96bx~ z=fru;^ZT>(=)R8n9a!L?^W%l=6D&#a+&v_iUV}W(#szREh5=<>v zuni2vR|_tM<6X_&3uTvw7?#+f!{`{7~$AXV0AvT4q7q}!gXl)2s zOA4^P2w0D8$8?pce11EfW>l;=w$V)RE-HfUbqQE26^X(%UYq{4LnVVa8KSc{zXVm> z3!T@-TzARCJxfw6BtmYMbh_)Act2X`#$r;SlJi#Unk5&=)k7tEr9MZy>zisb;Czd_t5`4c>F4d})&@SU^;A-fCU5q!Wz5LjtiS(jw)4L8L>6 z%jZ=&*xmFIfY=(#f?{KOLBJkg!u-vqZ7Dvoahowt=8TwUDGAjH&&e=- zi+s(zCcdU54j2ewIQ7ZCfP+@K6wf*pWZ{3@-T?C$1?|(x%Hi$H_;wg2e0m{2&fKKeJ0gq$1P) z09*u>`#`k< zoOEkRmq>pGf>0h!5{N)#i6F;bDRiEgiy|SD;66#9NmY^zdQSIsKi#^=3W!lRi6m&< zms`Ma3dkT-@&~GS&g=`N3^e-*i+V0BX?jW8vsyr}-bs6;|1>bL3=DT;LW`ESD&c|K z`V%f~Pr0|HIvzfJaqifBy-gAt<5aXcR>> zt`JvHqehL=l0dg4g5oZ5LmBr4(&7RL(`2N%wlbqQjN`&AD&vZyB7%klFbRqpTyVh= z+;7t^2+F3?|IfGT_7>1t-rxIspXZGId#sdQ>UsLr4@yO36nT?WYs~lEF+#MVjjz@QS8CL-d7iO`Nw7Lg@mD8YtrBB(dpHlKuJMSCc5zI8Z&6?k)Wu+F)kP?nDWm9%T zE_5(99keqP1OPIn6EQ3&c=l{WX>37@FgGa~hUW*So}W*D9duqS6h=pAP}|T%mKw*% zCFk!%f2N{gzB+R_FL9~gKjiqMYs+4yvahPJqho;C7W*pwEJ|7~07BT5a00*-iwzwy z4H<$_+y>$f#rMtv$%wT${EB@%8q{Pa7K_~YD>?fw()Rdaf#^G-==Tf>?J$qasIJ!q zC}l_6VKKbktbRpEv`1&nU_+o|Q6YXn6LF1n;YBM?*xC7C0 zAfSP2BaxvP*DN#VGuDl--KD}&mu4YXqp|D$H*>y0xpTe;7piFAugbTc^GzU%mg8Qk z$`N*Bl-6K}qLjU5i+haX8deA?rhJ3!l+R!F38!}xJLXJ``jMH9KW3brs(|H3dKIAK zWlN|%JIK$PEiz%B2p`P;qD*~;qDw=nQe(WKmaYphn@=>Vs!=XE* zyGmftxwWyeTnCrwzc~=(*%4+p!FCDc+6n(8`{hlI9W#np>0Uu-YRrcOQ_JCJ zy-VXIDK$j1%BBh2-G__+?qdRDjWStFX5RiVYwwb*KMwj{9r_z)@?q*xq)bOd+)Ek5 zB?or5P3WryY6RBua63sCXiDV1L#U<@*94zGjvW!#UUEFbgj*;s?~C~cb&+&)VN~lN z&nPm;vx#uo9)EWKsopsD6L11b9Eo`L9~DhbUb!H)Tkha^FP!v0|P&%>Df??zT{ z?!UpUC0%leu>OWPsDDBkQ`Bq2%eLod+P+{6DYsH~Xwva^3V)LjqPgVP3*x;rQ1=3j zm(X46zNI^CYtjnTdEka|>Ke*@UKCLHjcuy`^GX>}NCYaG^bRB13^4K{HxJ0q_*1+Z zxbP0=mDZEgM+uz{IG5CMaTr%=wxr!X#kq$qE#FY7^H4>UrG_-3Ha4NB^e2tQO8wXF z&_>~b?d1^r;t5!({qh9t0L)*~gxe9C(jy2M2eZS^1d=Cr_oV8p{)Vq-kjmq0hc>fK zd&w}FRV8Lp)oC%4s#d#i{>HR>WA>QCXbRS?e-UhA<@Zq<_N2GWqvUn-D0-C#GhRJ3 z%&TrU2SwfOA%L_m*tE~tw9neKde~H-F-WfA2$*TWPr=%n*nWR6P$|9pnM49u6FYdE z$ylz39iK8k8h|r3mAH~(E+c~K9;Rf`IOBxGiR%6{@pl`UZk*q{AZY+icw3(-&5r?NSJ#O z#Ur)xzmO$Wzrp+!nn0{$*-@C+y(FE0_tvkp;j_*fG&zL-u{xI10300I7K{yNguHD0 zVs!k0!RA$^LG`eCYAwP1mSFRi(qP%TVC09LM(-xjn+?d966_}Z!gVMI;Bwyj8DwzT zGA2{^d+`NK)jsUkqSbhZm%{uAFd4sb<$jTuv5>I^rf!;UrsiR#&nX1R<+eN3W-M$L@Dw1SJ7 z*~}|0<+Zlq4gcixc?q;KVc;>fnhtX^V}Bh4V3dQ?EvI&Nj(jolsqf`)Y^$o+WZb?a z_R5t%{~UZ#>}~y%Rr#wnF{jYO1dj;s5STbVKW~74dP}0v%6I?u(Pfd%1^!zjpnzoW zj#3Yf>^?P^zbyHYhFQ~_2NZrAuESIKX;tHyXJ(>?alj}K&K25HXPM_;<+}M~m zKqjx(+-5r9+UU16&gpY;<=fQ%jfN(+W#J!)l9*6bv%vy`12u`)X5^c-(Sw$8vTV5!2vz*^`ipC0VaDWXeUGcB zHk=*I141`eC6I9QJd;@ap(NLmqhc`XZ7 zd{`U1J~{SLyaFT_;VM?71zJ1*MwK@YI)rU)US!ij{)YX8J5iEyQEzF3tnlf9C}WN{ zL2NuioV;NtFgv3IW_zU25?SJ9nC{#l13Mv9XSqKyB{EZNXrl}{uFbGevrEH5_3tSb z`WvPR8CVD3a2M4kZ&|R9Sz%L+b3}V>#rM~r8;aFwN|WXv6|R%qhJUmFk;}i{x%_k6 z)$8JuG{dz}boXU771%`1O^$tbTU^6R4Lw=qg<{qD117Jp@mISv2ONpLM0;rH!stgk!?X3Fp$Y$=ioCP_O-G)QqvZ_POa*k**UZ6}LF+-`Hi!N>2Yw-Dy=`-a7v^=da0IHU-Tn&9$l1RGfFKjZMpP$^qct86mPzo$lg54e{I{z zytIu9`X{_zQ?W42X+#7zMk;M)U07AtynbPReen=yCk~~K+a-Uds|&SX+x4H;$zc@|jo( zswayu|Kv}^*!)(*{+c#wvv!)~Mw3e;e9|`*AeDv#Bvg3wG#no@w^My=tnWnC>(sE$ zgf}ZUd!H~0JI98~*lf0$!Mb}PB0sRD^YL2xI-WZ*U+NrUkrP%I%8xQD53S+H5%QT> zD^M)605>f$5^ak}{q_Je#JuxqjhH=mB?oCBfp-%-_1Z&U4D-yw>kcLgNUabBes(qy z|4Q%Cx*4LvsM2V&DX29-$EjozH((x}C^qub(v^=JU~>~o=*jwvr|#K*$>bHm=;r#* zOgsmsx?|j_crCnN|0RhE{3Wi7Y}vbhJDlOw_lj)k6W+_;_zInTNtSpnaL^p1=!~tJ&1=VJA4dL_ci)de8h1 zmu-PTCzlxp%_CX#-DY>s{CAgaLe2oM`qXr0}=r zeORy4a3nfi%P!Gp?=?mXorQS&F);NO>S9+dW=}4=D8ox@VlT>hM-9HCHKK-ypnRp$ zL8D#1)dX!K6yZuRJPJ{4(&AyWTN-`2+rmkkWsjUM>xKW;!P2ofwiGX#SC>ZL>9%2# zu~+(UJ&360j|#iBHLoh{wnjhg{K zFcuTDG$H%Kz0?$+A0CU{QjrFWnu;}JkMBTMidt-vX3Z?Op|u3^JB?~ySU4(rN~dU` zGl$9@U)iI!t~klyZ@3Zup?k{_oR?=4Cg1&4)XHGPR6=xQ9RMp1sW3OwVWsvn?doUPSF!P$ItQ@V@tQj>MX_# zHO1zK_jej>^)^LqZN^@-X`fZyyC<q)^} zP|2qR%HPmTlw-pK20$ z(66=7>!0i}r_9k8c7FYn4nKTVeO?qkHiqMyfz6!@<_te)?HRR+HB(|O%CBo7Bv`}@lp|+~hCQCM4s&4d;2oB%RTi+<>752bjmRN9z%@uEe6%Yl7DE zl-pYUsjPXe)vF}$>fYF!7hdHCh4LR~iX(Qu#jGUZZkDTX&^-7_!{ek7^5f zvG4cnMR1=Zb~5wsNmoffHl z5MLd6^?hovqfWfJR2D!o59z7%D8ox7exKu0COyAXvc&G0Z#Ll+YXn|?FVNi0YBkOY z$>A7d%nrvN{%%@`yUs)yG{THG%8P^oX7!JVSJK>_XD_K;IhAccLUnG;gNQ*+eQ(9j zrA)R)vmZ$v__W65kK{`cJ_4{JHX(qMh5q~$HQey!(yOq7uE@@7K@+CXGXKrkR< zI)Uz`kE9z;bEy)Qw0ud!nFT5|oa@O!BN#(U)Nsx>fq`E29{an?A&&^0nUqilow%Rjy3N@y97s$Tr$mA0b znEuhu-05UTZHt3*9@5BmePRdN^x{pnO?yzB$|nhM@1f~b;T}DwftdT$hY!O|?zu>g z)MP?xavC&aTig?DjQKCqe#KwRoW;@cKf=?i0gPzu0*wp-e{}njj{=Hw_v1QUqrTHf z$w|0xU^V%k*i-q6t|6Z}30K{}Np~vz6&$uvp8Jk+MSUALl1uyafY8%GC^?cx>SWHV z(jBqNEqf4jGLYSSO=IyrMK&QckudAept6M^cO+7j-anl>kB^8kV~oDVn83J~9l?3! zCiLb`Gr7=bLEeCl=SMMG%71+m+kk(2T-9D16TJ)pX?aW;EZrRuakO*s)PYQ-7ENvn zzm(`K*zR{oqBjS`=K;0LC4X+hNY-Lq4aM-v-wD&Be{vJ}yDv#_qs?=DghncM_D_C9 zp-+0DolWT8xacKR_Fnqv^SCg9A|Ybv18E{s^Syr?|KXGX{`)XFZ5L-)JHqUiA8u4b zWb3EqA2rdv!X=5_=dz89$-nl4vPl8sU$m4*TTQgDX|&mnuKsQQ-*tZ)^&EZvZ{vR_ zqPb1}*AuZ7|Hsk~Fr3>4|Ene9Tk-!;FZ7rB|N4DtBK~9kziE}!|119QltKN!L=Ks)p|9k!qr-c8P^8cqa>i-@8??f4HTmFgI zivQ!0=WX-9+9=hI`sYwD^q2Yn`aNkP{&V?9TmNtHKfV9NsQ)22W!zO*zbMs@eLhRy zOh(_kKdbNevG{J6(f96l1m$qr-GWdV{T{5SYqvfQ&9Q5DCEd9kvzIbOXrf!LZCmSK z*w$G#+&0d~`3lgmal65_wtZ?oTK*g`z2=X){u4wq{dEq$d%eq0-283bKaHV8_`5%v zx;@BNY?()=4ghla1QvqL!~G1}C*Z%`FyO#oDo*voOh8AIZh%84It>z?%mcaU>bcf7yb;xSa=D zgjB2@odYl}54rHpvhZ{h0rkT@8L7JXne<2ehw0beXXrmu!nKB+6Hi?Qbt;T!rEOBT{h_>rLK>U|Bd9wrl>N&PenQUC-2EyFgm`8v29ybwE8Uy z>_ov^j0@HQ?0;@zWBBCb^XrEMxGN*F@tD!wIp?_RU(k0=OA-Z;u5qkws+!UtH^u~Hfjtwj z0d0hDHQ;nII{w!*zb?F`7hD?=?w7)9+{Gkr={h2Q4QwRpqVN&vs8dW-Vf-{3b)moE z7~ay+$C&7@@p2nI%HPl{J9-}z-QBD{Gi{9TL8P8Ld(R%;vx_oC6xUJ5bl_zsuv=V9qv^o2P2l#4 z2@t$@cvvdjf7@?Up!ZH(B%vEOrgO1je_@Lr6BkkiYsoxi7tjLZL=6-r2J7cU{czF8 zqQuca?Gyf03hKBDQ(B)yaXO?2Ayh3el%CZ-W`Oh`NNc!PV!YsfrwAs`ixR6d^5JhR zkgd9!mEFXd2EAU06Lp;yg#bR*wGtG@xR;U%$ylPVNxrvaDzT$^-??*pO0WV@mqv)? z!Ge~qv?%G*?CH>`Y2%S4Sw&O-cYEKDdQa`fSKL29aI5`TOw9YTg%%Zs$-`JrLKQ3h zlXV!tbD;AOuM8rtM$?7ovZ7qn9fg}XiL18aqlwbyF=LbPBV*;wGe?FvW?v<%L_P<#L7C?=&(fx377Vf^+9pOwxYM7(pdhfKiW z{5~f846>)wnvFBrMcIJC`FoqRR|=EJPb0z@Zaw6>cZ9AjMM7?b$#IOJr~5-T!)%Ep zZyBpyH>>VQ?eD-pG1uDdNXO3T0%xb$2-6o5GtGQ*K+S zW;^95)yiAEnlLsG8CngS>iMXO#+&0^A|Dk*mh=lu8Okw=0{`uQP^#vy3IdVOx&|Vz z_N$(9O(%h_G@v{CZ$A+^3QYXGYhdDQM2;-5~;n2o8PeaE>X!x;%IRzahUl% z$o%eaeoM_ShJIpqGQT|pfj8ej$jttUqi)}Slu=ze`6DRQ8E~MVK4Z>UuU+` zAz6QTprUo$AuM+0<=xUpx#nc$dW3hIgW1PYyLXN) zjOOeuhZL+$IX&J_kN@DOZgMqSUO%lrfsIPjK;pPP-E$1=m-MlRTgykZnT;2FS2uiR zv~c}i0q#HFotYlUlu&R@#V4a*V(W7^QgFsh3qu_kkeVN-#^XP@^Zo?RoYuhJdZWB0 z&G@|xA@pu3ue`UCAlIG-zRS%>_eVq^v7I^pl3WzX$0Gy-&YMAp>Sh3XpwZPwq;>VJ z;EArjk_2g8ZI;z3yPL{B5fT&62%gc$yBdAWCT48fB-z3V7I#l2`CTgLYXx;DD1I}Q zV-)Ousko(zTQh^W^NBOl(~P{KPk&13(`mTmvHL5nKJ|p^d6XR@utN%71MoO!l_)0f z+o`}YD#TGCn`tqr&=V9IR_Lc$q2&raU!kvMh3=}*kV5BXg?3ly;R^jrR_N+NLVGLp zwyeu{}}%Z`G1%HYaU*6KC_ur6Z4M_?XOE@ z;{o-3pnVwb8Ke)^@%;^j9}q z48wmN#eSnML<^tx;cfA zu%hBU){>J=FyZUO2mPC>Ir3ThvPRUx&>S5*)?*q#)rxJF!RBwT`8f0 zMVL;brbWMP{%HID-?9SG{I#$DYyDd`EcZ7K<_LRzPepa@|84Wv1qz?4-3Xm9r@R_n z(}8}e`r|x$qwUSBw(sBWZ}c~>_Vr)b|K$yD1S4DW>vvZ~SAXNs{Qm9Ds|yq(c&r?4 z3BM9;-}e3n`PF7-YMe=I2|B&6nZg2!@vhx&*Xz{vOwovfR$I-`Kud?`Oqc0TjyL?1 zH;DfA^TY>j4;V?5M#tmHq3^T#uBlk%zg_bSc75njpS`LeIt@?4<~z?n8B2-^n6XX@ z%mljM-^F_atX|}wteyITHs)^aAN!Ph9_tUAPnZepL=kwvvR51GI;kygAJUm1R;t*0 zBW=2B^qYckGf;J0X^eSpa7#$3Y4R3;xj)_^eYwb;e5bhs=zQW3d+>V1XZH=T>tn5Z zDOuz70Ctyp=})ui4^5{(Bs=}lq=&O5w;IkSZV(#Zkwd%8oZef0YlAOzCkR@svNw4f zOF@V2Nic=|r@a7>IMhAQEA4Z%IyV$GL$<|Em*TODNUWuKV6bQbx=Oj7Cq?|p7NPB{ z{)T;kD!npkvFbf*)Zp=5hn~6s8th=c)B8M|xxU%`@OIVuVt14+Kaf*C+t6(J=y$VG zlC_*~-AaQ<(tQ#NtT@H5M^m|X0!obTWkIbMhYX{?FUVqal30<^YMx1V0Z$LhM72BA zgYnMq3_JdjhVc|IYGTi(*`Ydn#sf9Z166OH8{D1Kh(YR@22&OBH&L?g48U5ekown- z=ePdlcf1kEc0bU+l|O#_f0+Kfob(!hU^9(X?(%_Tq5NG$hb8R!G1^$=A**Sf;o+?A z?ZBHF@MVq>jP3Yj7e{#a1v8NacNaiXE0UnaQ}x)=*nzw<4HL<6Q z;ip*kE71}A>i|AmBS-VAzhG;mU*@%M=Cw5Q+S7a07Jyelr6%@hkRaV>%Sk!I9htA5 z9_9sZaK9(j0;ys5aq6iiHvcT5pn6F@7RR~U5dlM)HngKr_7ZWek$X)cTuo=52C-@0 ztJ3Be9^!9LF;yk1rjecFkJQ__Y*^sLN^7Dr^`e>-j#mn4kl$Hp_oPcs&kusmt$C#s z7LABrcRCF%=*-uj-(h4Iqv-oc9m;XNdop{%>-rY#-Ef4TD+Q#ro2S*B8I zVq@5f>f3C-R57L|gx0Tt+hQ1iGubcP^Hhvwv5^0(`7|6<;h*1Xkyy_&7@IGiySFI` zNhh1<7w#cE6MY~){v@pa1$rMuRy|LMHhpp z5sgHF$N9Cydmmr8f6zy1&iJnb|4V)zpK~&hHn=`M#EhZ0*_xQXVGGBpsq3VB96_1- zHTo_-<+s`Ghk?k(x_G_9?EJ%=|8++a0O6)d#%O@lCw_{~2mre4YC2vMPD33jF%cTy==c}W9!@VEgq4j_IRHCxdJsqHqFUc1ZzEV;@u!Z;xH=;7as{8dxS7YZEvY4kAL5p{LPfYM|;yKe3# zP=6}!%Le+`$?NO;fWl2C@d~y=5b+ridX88B*6KUQ%Of7)z{#kr*(6EqsOC_-UX@@1 zYe_GrJ&AJ2sqftO!Ns5Ri#a^`&GxT!4%>7kCn?mX8>A}Z7E+vr+1Lp)kPnp&jDg_lKnz60T#f>Pl?(F zzrCo8RsKj}ZUa$r*)0X9xTA!Sf6g=eNJkZAm6RN$Ynjk82_+`2y~*DFxy9`;Yl~^LAs9q>E4D9G*(g zm$lz5iA!6xRu!=?MTDFOdU{OZ;uu=st@@1r1BNXqETyq70#Q(63YO7-vD*qJk{}qZ zDHsssqse@DfqZMU8;pA4d=K!xO}H|9-zHr7y>AolGryG+_oU08PEXUsi~dZ<-88_% zFy!276mB$v9yK(m`&TuR0(P3=^K4*00c^p+8Si8Vc$8Q(Ok>O=UR87wNCbLkwKu9_#5$wG)BKQp20cHMJX1x6O_5!L(XkY1y-&6bR*{2C zO;N3bO_6nGe_D3`+*e(I<9qOCHAG6(sj;V1!hQ|MAt%l^9iP7eeLk*m6AC=#OT*5ndF~hi7X2&WYHD!8D?uAXb>}T}SGJh1NgSDa8r4 z0jJvwE}NoGKNX`CQAgR6j%j~RuqRncbvBaa^(H#WX+(M$*Y8^!{eE5^0cc&d&;(c{ z%GKJl^c{zlg`tD&W~Y6gv|iNZL8!tHfa=HOQx!$#&#)!D&wv`tVc=Y@MPc@|gn%?ZQq?i}PC|wG zGDMgP{Pad!fw~T21T8(=#A!t98~0(QM6~8ho7jebJ3$HfXSBd1eV`~8fp_9HFYrnN z!6wltVSJqnq}<2Io@t*(9!-BW_m;GN*jhf{X1iZ7`X9)r_B0@v1xczGC3+;z0QzRB zlea01W@*$(6is3j3+%8uP7Nw9d@`SlJo(Gj?{@riv_Y;Q&}ihoU`$`}bqv`ja>cHH z@>s-_;{h*jK$v3(f4NaTM!G%X5ro|aw@NyK74P~R%!Y#nk`Hoj;x{;{^(?+zpU@$( zj>lrW&2w&5eajj3J{+=Zyp}@bex2p&lJh9S9je+Qy-k;FikkGC`xkN_Ot6svA12_t z0o;q4Z=weFb*2bDt8;q_{PijDI>+#xK_!(Wxg=_m8e$s`LcUdOWP!5h)sIgV@gi^& z*B}+~dqq{6WLj>;1N}%_-z(@a&Uc2;UV}8@V5{K@iMdIgD1vWQI+Cji*Z0UI4-_W0 zH($|PP3yknXc9I^CS3^Z7w&S!AkeF6te&{OND%ZUR!Lk-zuv;32s1@% zH5#bO+MDX)dyp(MUl~5kEfT0$<+SyBl)v$Px?3|P*Tsu4?g|txnQW3LGfCVvHz{(Z zdy&DT)t&WKhxu2Qf5}2B!fc7cA1PO{9DLCAY=d^Lg3_xvJ$YVVZljhI3f#Bj=-DSu zz>m&J+`-#7GFM#jkFDhR?!F<1)3>4M8Kt4<$vtbM6Z!>O1|6M`j}_Y?IMc*w;)|Ur z%7yVfSQ8yxm2sx7mp;cD;!4v(x*H_oVVxx(AT7#rFA=v!~uLf zFQrD7=jq&zyX6KU`L3yPBX1krgb7;dCMDU3T6J71rYf_4?*~iYBpO!#CE5K`?5;vf z-)V&df_yX?V!c4Vr2v9aFP!fI-nR)?X7AgCE5G+`!Y4J`$0jp^zBAZ5F*Aa0=1};6 zV04JrB}~aHwPIqWBBwu2-KWMfTK%4C1MBH?)ggqU9GS-|;msO9BiL{ySALNPZ~s|j z^MLTaYDou*kF!Y*d&!PSoL5MYk%k8Z+=EyR{sv;I8Cm&c=n<>TZ=+Sl%I|?;On~o0 z$e5~r$0CM%D-amM>DSUo{Q_=1LyRE@__zPo|0J{a}YC|RuX zxwYu0-INo%y;&HI`pzaQ=lq7XhuX878gy0qN#XtlKpv60hZG{^F{|+;OQd+~lyo9t za$&S&a|?!m6*$@VeaRb4dqz1Tm7np&*|wx_2``B~33=0m6efL(6w)Q>dyXd=ZZSnv z>VaPVoKC`w+Sj{d%y_2!UL`|3|9!R`{U`X#$;WcH=eCe< zrX?G3>7Z}S`T-jkOk??Y5n>i5yVqE5`pPtxH=m`k+yEEQ2oY+vVa0?1OKbQFBR&Jq zDQ_fyvL#wRM^E2l=J$SnWmW>UweEYcF!@U4hx}XKV4}C9A@6A0BRG{8lQJXSaUXaH zN7K!syv#s?kl6yn6`guFf9|NlP#w2i4D=-hX|@u*);{cF8&zVQu2qA>PC$I z7_ynaobod5iE{s^C6sox@$!GKT^R{=Dgz54`>pHJWWSd%WFPhnWKXkXe++dfmcB3q z?Q^L*TYGlQ{SM|^CDVmB_D)c0Nl1(mJ}x~&a~Qz=+LeClREEh zx%0nyUi}cN>SK}^FvDWk!jPSH;0Wp}5jt9dDfPbDT*i+jfv=q8_^aL4yOyH4|c zN<+I?%7;7l>U8IeqDYTdv+a*P!A@zlZMC5b)EXCupOcYN4uux?E=X{E&n&ey_%Qs4 zRxc&;H;NofB=5f^*6jr@441KkXatCxiOOOq#AI_Rv8nNXl{1EI=wphV;kYM7!B(;G zego>+8B?m!1?@Lhx!MKtNCK<#+0(qzor6-;>eallEbRW5W$eWO}!$uHr-xT=Xi5Hc;+~q;_eD#VREZMCV*SR5w?6dQuA95(bjY|jT zEGKr@zeoB@ESN3do5h*@YYdQ?Oz5fCzX+A}?rX54#di$}^ILtF@z7tZZ)Ezd4jlA{ zIzK7%dQ|EaUBPQz{2VaM?N7}7OY?FNsWx=Wd~lfUI@Z0+3TkpWCro_T-em{Z@!wIM z-T+(u(ZAjg@B}Q&$jiS`HCDsWmbT0OI+`VrQDt7lao?;fK_-P07iub9!&yoq8Tw4Y&X z@h0GMpUX^17HiL&GeF0e8a$&>Tf`#noaWq`?^mfUi6mTgWLgP z*1?LC?Gwj;lNa8Xm02?}TuF+SfrsI4Yf-5Lvy3X%MCVlrX6k}#vq!NN+d@HjCwDw$ zCb;I<7iJHGQy_TenW~*;X~Q6RULGgqn)y`#u?32sWo|u%n-&M%R;xSvT*0Y zBKHJAI*8=DTKn!oiEqh$dVt4AmqFehB#76TLGB`V2R;-tRFVl-r(@OLy8W|8#Nrw* z-9$tuimHu`+gI+FGx8RgTC;DziJMsBn*Ne}{P)lE-?fOD3_;=j+5NS*p`Y?)v)K_4 z`hJe@#7jmOtWOwg?xTbRO8;3krK8VLk2MVj!Ui|OQ+N;2fB?Mz`Ci(Dcr-!QK4p}q zyStJ&<%tU!s=cAK0Rl|@O7?f30ZZPd+QCut#JQi7I#%)?kJMP}DzL4?I!P&Xl-sgT zV*xu_=ND(mmD-mi4;?$GFm=}^3;*YXZ76o0F&izSER2Bt^W|B%Ha4o%o^;$nD>YYf zG{IX>!Jv3pp1(mG(Ll3$7RS7*XZwHqg%RYHZUiXe2iJ8W>iQD$Xej(@NzTBtTz{bkI0KFwYKdz~?O`r@rkU>wsf%t{H zjKPGKLBmH%AU#1;r@ZXRn_X}PuOQtu`f{xDG;$;zyUt}d(xsD{is_PK*T;v|)!CU0+ zZ9-PMJ9#M{dWTiJw7gsU+CdVnV+R(pY10hYZPkBF1IdBdgxfpP zx6#9~=y_{?H&g9&ApaaC!NU59H&nF#?hwS%T&ecHeBt)s3x$FD(lR7@`%(iWFAB4& zZ+gG=?CizKm^;o?2KIYqF*|kWeP|^K5DT1%UgMKN-jB10j+MO zY43{?JDGO%g?p#4(;k(n_NCoDTrV)Q-1OG1?#;`!z?n0DsEa>C1!nk{885K^QbPpI zyL@X^q+PO9gZnEh`tHT#qrqLT9c@}4a}IusREz{Z_(W{kZ>LWUx3kKVHusF+>)ksf z7Wm(h{$}lct@{W_hMd~G#v@_dJdMS~)wu@sl`8dMmHPF?MsYtwHI%x41_jlJJ3}w{ z!V|H_>mC1~9?DvzJ9R75xKRaf(35D7f*_nhF6~XhpNR#tfr6yp9#?k*w@-N6Y-mu> zJp{QsAmwJdk;~7Zb4#K7G<>%rcMVC?`oQ$Z@nHbY;ph>@HI{oWgrw9LI)A3JkD?aF4 zU+8`T!;GEF68c*biarB>S#I3r#HHu6;1iT)y{ied%wLW?y8k4v1$ns2<}Ww?sdW5~ z+l;SF$FDPkP4C?V4MfcN%3Ow}8^`C2+cFQJE!BroTbI z#47K!5I#UinN7Xnex<5%DsK}E^A3zoPEXGkmSg{uzZxK%Vj4@Wh+@}wokzWeh!Pp{A0_`~>qUf-0rr_J48 zDl|2A>lt7txmir2DHrqN4!Te*tUQp!Zj+MI#1($M4KGvpEQQ;_oubYqD&559(tp_c zc6WgWY`n9XYIy>iBaf_SK7Nr>=zbJ4`Z(r8l~*!zC8G~wWRvYG3XtrZit)gHIZic`@xT<~xIu)8lh$e^mCj(eJ0}j#>5$ zP4z9C-APJ(c#E%vHzqG{@z5U=mFCRr6W(j9Z)qm*`OND>-m80*#qJ+`y9e^lwruZO znTZ1GRL)RLZ(=+P-lvvZoyDySNCLN-FMxQb_Zg(rfmY8B(}5Z^=_}P3@?bc04^;NrT`t^p@82}0O@l< zK9&XYf()2<W-K2&&N!S@;+b zyBmCZNpL@f!Ih79N)r=bN}Tk8mCsn^xD~Kjn?>E@M!*2Jg~K$C^_Wh@jyIoETZ$E( zJVElQ@#c@?d2>p>8m@p=_tkCn7b*C=r{RAf`P~-$GcEkD1=Ya6*TRo^@UQxL_|Xk4 z8$^B%@D{1)Skd$};DHwK5gy>30Gw(+7GDGJ@SlVCgoRg~hPQ5F)l%a4I>7N4ov1JlZ)aP5VESPt*R%l@&hAgjZgpWM2CxLC5ljsl2zT zO0PBD`<^N91s5~RvA){z^E-OEi; z;ZAjntguX#qK_4Y#2HhW-_j~+gC@dVVV^<=d-mFMX@)k#XB9=sdr4xIV}VUu)Uqfe#RwFbk}T^wo35kiPdBAl7t)(ka?CIVFj6F5a~jUg zIhDPES~&yR%Euv zk5AQN`7l- zV0SwSGWe$8y?ll!+XlR+OglF4uD9@}TX;u$@Kj0$UeGy#@gl&y@wE9Klk@Ff%O|y# z?mJEv+*r}+Y{#_Hw2$7LlKLT*>lYKB;urAT<2vN;Ve^-y^MAsIMe-lv<=?kM{!Zlo znZ9R{=_89?762pIGc2h1Nfwp&)XSvoxwbz$!F>qz_cQRuSa>(3;RP+cKYH+@+kjUW z4*@VUA30Ro)y^l?qFdfDGwkzEQK;QrquHIeAI;s7)aW$bjrWvESrVndA#Fkbz~)33G8tV;dpEjQCZrDYanwZ$zYSD;8o&Ls@UtG;Ku-vj z3!&mSBNDSTGh7x=l-p=GEJC^;qz-g{c%#KZj5-?*%vDH~!xM8F*ef zLuKFA6bxmHo-W+zrlJLS!!i|^1|KSG4o30wJQVQR@~`=yWI*?sO!cjvDf5B9;RR|7 z0bIeSdza}(>_9V6%K);Z*RVq8ALX5k-s5 za~w|k&n`O4fIO>tt^X`v4eyD|#JLlBvqc6?ye;ww-v7fQLu47{A5nCQdD8ZRnT zWO30)y!-pML&dVK+HRXd+Er;#(H@HKEJC=L;G&XsLFS*N`-QY-tn#e;snYFf_cEJTo=Q2n?T_(jtqM=+Po&uy z)Hzt0TyoE`V|zF~5c*(runvkbJt>y-&h*rAto)`|E!a~P;*?)iEr}`Vp$COML8!*s zyf*M^#{VeV4&|rHQ$rlH&GP!C%iGQ??_)FKEdQy>ly|=#6moo~yb`ax+O5k=pId9~ z3NglnnWHcNRlL8ri+_i%(g6d^c)sJe#%FeYokf1v{bP;k>i2T0zYJCy8V_`8-C&ej z(z$eXU&VHO87r?_su~-=YF%DX8Aq<&;Zv*kYyGz_>;4?-(R z=P`UIUd8a5VK6+0z6^fOkp{z`D2KtwzlGuaS3C^A7lx;#F^mZxgW<200$fh87@lJ> z{NY54;hzZgFdWURFnnaFx_a#ZwDTk3hr4#)>_6pb(m(U*oX>q zlbPIc7$I6am(SU-a<+RFjOT+rAsdtRV+oqUwg%VTKPc36`(o`(X?IQ`FinKZW;hdE zkQyNcH*m_O!w4x<&?8iEJ;m6xr06(8Qg0n4MP%^>DXsHGD+R{J&zd)g-rJ1~mIQWa zkC89`2k0FSE4M-Kkrep9O7Di2YKuCQc>f;+V=%LQtCao3Z2c7Zl3Lb)PxWe> z#=EBSE;HFA2eqp*m8VPX(qr8Jp&Cq#$c%A+8RUFBI9?Yj;E)m>4nthYjveA6F_|H5 zuxyc$57I>zmm2xlrah7V?dRyPHkJARXZo#t{Jsi884ByrX|r1pocH>M;h#MCr^Thg z4Ijf=E(2*Z!!ol%x($6+YV}#j>5?NqWdiG1`7x)Lq6LA=PA+uuvl?wv#a*^0GNf}} zu=(pgm$j%~nUoY99xRY*F_V|zyo`PjBFvALr{_mZU=BA>Q?={ahgF~3#^;X%|JU)E zo40%D??H!|S2G>mV0Co9x9F|u?0g@Xr@F(leKUEd)ALO;&*Gv>d1ei~->~pN=X`Mgi(oPl{6U+bFlF&rkpnbG(TGo_vF z+s!L=?R7b&Zar0R@NIT1b-r^=sGy~3tR}2&l*c+x16?E(4k)(R^r~b)|&!G{&z`xNJl~ClTZqIi^SZn-)K{Pf@skm*Dd7S@N`Gvuf`Y1c(PI8WL zH9}bC;GV4WahgtIPt5j`DkG3U@j4F4Yj_c*3Wk6t8qjb*|=Z$^V-q{j z&exX@Kf8%HP1LCRN8CJ=WGf)qq-TA1Z3xDmogr>)p*83-M(AAIkz$?Z2 z=KyR}*umXpd=$mO56toSG7pul4A~o9$DT($N@S>Q2^Yg}Hg>yFz@FGLxl%#KGtq^C zXYz5-s83H?{0*gQ1y}B;m_ajJnoAVISc&nyLXT>(9(GisW5CF74x-;DX(PzA2B-tGj?7gGa*e)G~!! zRmzCbP?(-6dWijrl!?~t`LfnW;MiFV_t;_SoYOft=?BBLkq)kztEUB{byz+)A9cJ? zmN5krs18TDS5;VZ-$dHE#eYAG7k$H-&sin=&hZBSwTBq|@8luo9ZouPqn6F~HHm~@ zth{ZG%{J3!n{Ts?@Us1=P6y1XXQ)Ka3=wWjhxkP89Nmj_Y?eLl zpT`(>y0XWG4@6d8dxn6tVeIlFD4vrgt?ong$?oI)SW@dqg8*Z?yMiPs3rk~W9{zbp zJKds!+8M!ux|yl88$Q=eJ%5?)8p;+0n?Ip_y@xHv$c?qsrSzd^zsLCGoR@A&dq9s` zPP9&D+Ewnl!&UEH&8HrC`fQIFOT_K7uwEf3~@D?^xv zN=GY-S2N`Kq7*|*w~a8@)Qz>0Nh+oxKJFj*u~PBLFVISKh3>sF*eH z{ed39^qZ-=gNza@Wv1%>qz6@ZEa|+e%M(6bQ}}eOy6?!|q5s%c zef_b2e%@t6e$oC^5PmmUpuTV0_NV;i9`Bli%^xAvuZ5yVcHrC@;NsTt<8dyxzee7j zGZFO7rq2jCU7ZPhCC%66PLGPs{)pW82Fu>jz=WGzF7iEifgL72Zk~3S^yjnCa5{8h zdxQ^Am9|5kGutxsc7-q=?`s%(k{&R0HKFlR#?Us~gXwIyc-hXh*+$!JJ9^okCe*8k z8+dhZ;fJA)uKcf1)a+oUVJ%a;2iI;9#+E@`w%0|n6%|CAsr2=|)4R}J#|C#?LOtPrRC zvi*(xY^MkE^9Z4y>*Z_o+S&yWOm9cW+F<^sVE!6!fXD?J%|V}?zfhBQ0jZ-J zOm|T&!RF6t%-_;QWoSVLP|z#g8Rf{pcF2I)Z>9D-xU;o3?%|x=*-n_o40d)oc4w{} zsc7TiTWLGSl*A2|wE?o*rrGOp%i4A7SDo@6`x(|gxvypIP|_v5acxmL&liu`JPT}| z_m$Wwx!KFpi*#PQTtx!+3x2o~Bx|Sg3PKVqv&XN$g#UEmKfS5Y;D58lf09ZzW`%P- zTn<-=Q+~3=<(qvh{&%RP8k?s!ou`kNCuw@h^4)Bn`CguLN$25T%B$OlpSfr!JH_|f zU{3-QA7u4EY5pJT_|cx8@;oCrFEz7rj;#3BADJS_EPE}OTo|la9@m#eZnjV{1WkR^ zGWQ~j+<0N-ld|{XukI**pm#UuWkxG{Ev<<{sJ?q^ zs*fXmg6n;9_DiJcJuJI^&+b^iI?0o+Uy6y}o+kNK`gu$8!+*CV-=Yww{2t-$lpO1! zzk<*d$r>BjJY&2(Lu{T=HcwYC&%=azBwxv^JBA;RWG3An$q8SI-pIH4-p&P2oI|7+ z$yMq7A!&O5J9%E!FNOHLS(ez}E5s>(ywnhTvL5KMuL(_DZ0q;2be`XOdCs$WZnSxJ z^YY9i)Fbv5UftjF1F^eoOP;r)^n4O07H@Mr&8(%JCFfvtvvVE8pDkwivxn2onjPfg zjXAUK2h)|euGAwaco)4Bj1~FCNzbsI zZSy<;>{B*RpGjj3qF6SM>uYVEzsBadS=7YJLkviW*_)WeFiUZs=ris2{fG3n(*4IF zJe~4aIpK^jU#$nBJxJ%()tgEXt84-$z}^M{cPT+N$BthW?u8Xq#CfxKj}cE3omlMd zexNDKyNVE;9F;0(qLTg- z_m-Udh7#TCi=`5^`fkd+{@QzOto8Eruz7|MZg9-lt26u#r0$ml<<+AN%I7jF=Fr+} zBF(A%CxPzVy-dBzP0!-L8kX#QG04?X5J$gTRF2boJ}Cn)k~x{^k<~xgW4raWRTU$9 z)~{vLZ*q8PAo@~u!&jVtjg>!0F6{*F1`tH2DuiRFsP7I!IX@icz4y&}@Bfv~PMyh? zwLr8>VyNOy;!?+CxC;KAP73{brS}gyzLN>Utf@>zd>+Lomx_?r?MFdL->92#-PY=s z@d0e;{Qf%VbeTn0MX|1F>XWX~t;cWu*Q-vihAXM_+`hNTFRg}issVlVQc#y%WsC(@ z;&b=c&>zv7&E+Xu%n9bFK_Bk^T2Q!ei$zeXUWv>oEcL zK7n*9qJCs(BsT;Vt-Myva9s0QMtN*;N7}+JW={~@P3$K|5S2QO9Y2?ND&#w|>CfT} zrmY0HQ}+~iSEUkbV)_mz(#Y>_Z{hA>_8R$`2~8|P5)vFk^*zlO#wK?xX_CIj`J&>k zN`F(!7`AXMNf*aWJs8vPBx<2Ykq zjEF`0zLam%X3{cZ+gCty4lpv9&qXx>nDOj>sUWscmLV?`SdDVKQEBP zqq*&VL-TIuXX@u=Fs6PMkoe!MpSuj)E$;QZX4TIvCUCQR3xTSi^C|Q{sGp-v_M}^! z!F6|w>(%FF>SqswYwsON{0sH-7;H+_&$~ukGWFBO_qOT>347;0D-Vc5;}?uk>f+~u zj5nUL`to=JI@G7u+ydsBhw7a)BDdE(;03$xN;HUnGSY<)Rq{E#pQ$$ue=Hvq_b|m7 zr{AyI??vX@U7#&E ziHTNEp+5bSyAn(TSa}85DH#@E>oP~yz?xW?MU}dlHO^I2((+#G(A;UI{nrOub(gNW z`u7`jX%Hlg4y+luYDlbVKNT{K$_^yYEY=Xb|%EOCQW&gPAQa{5BA77xYPj zPF4+Ub_BMbW55q@WXJ!?iUEb+Z43Vr7Lc()8T*mZtJ35CL~yL+_H(IHhP|rN%oLM5u*YB>0N13t*Aei;qw!~Vw;y8pVhD(zRDSrTYp?a zy2*X5H}GeK@)ui`X6X6)GSGU8sh3*qU=YyrVT!}S-wB}on&N*)JOn*LF~*PYuB1!s zMXdY?yJKwZZi;Pke-dw67fEo;1tGt(M;BO^O^-+1As~{LH_Z?5hjTXhoZffPf73gj z%18RtX$SdGdiOvQwEF5ut-ok%U3^bM()Np>Q{)3Rrq+0V=p1wc#ku=Wi7)x3c;;tL zNpNXBfLXU-nDp_T9H8dda))bm}g; zDA1@1XjpMWb)#4`Pw-GTE8S_ki=G>Nf#`?w^D=&#xzj*>*E|phuiXqnx;6NR9f7pc z=w$YIy&J~Im7I7DOZRPVq*rP_ZO4NiKF4I^6D7?r;FI^W_#9yI5!a2kKKBZX&qM(J z3_k02OW|YItEt4^PxMgL^a`?Q>kcAkL(`3WqxNQcWN&a6?QFi!MTJHnzDR*7%8vqZjA*++SQPhL+u>E3r_ea#se+-8Eg6rFAZG=oSF ztso=UZfa*cMs6tX6fTO~uv6!;U7dX9D*fdRZYkZhI~35~eJ5(apixE%jeS7E?L!<> zroWL+4Zy^6II6Y!M@elkR{JBu3`@k9z+C;hzqd81gX-OZLjyW_2Y_(Q&)$EBAa0#M z51xAYPtD}t$>#5olixpwTf?~ozEgM~|C}@O{d1O7EDQH^hIT&oWDE}e=LU81KR2`! z+oHVd*-=s3njfX)qkogcLq5~l-deRUTT(lP&kx}Vw=;X1*>PC{2LjPnGm*N3R8?g^ zP=}%XmQewxYTr(ynwtv!&$Uq>3;v+#-lu90#uwAQVrz57duFqs|HS5oB?14*i>vZC zCQgj}P&|6?;M~!rr`>q%CC4Ko+>(OR<14N%4P1ON(~-G;3QF`!zJd}u3$O;_`|j_l zT_annEzfBga%k{O1;oeFL~``Er;k$f8q(YoNM)(2AM&#leRX#(MK6=7;$3qVpH0mT zP0+KnDu0u#)jx+#{8wPJP5w&^3{JKJra>{*(rB}P$$q>h{cZj^Z%1Ei{<^rzKc}TR z&h&caC}%AEZh_zHqxJh1Mmyu0xnwv<8lIyT1JPwQ(Kp<^!Luqhl1srS_^P-~{iw(f zT}GFT3bYRDe0*M@waam#VS%|mvA8!3?hXJLEb~?WUCksC9(U1XQZkz+Ev@gdXBxci zX6R1g9v=VklJ*0F`mgGCzNyr7wZ*$ z$GwD%M)|O8>t4%;r+>^+k=ko2y?eIQ8=3I8(l0yHu^lp*lI)Mkul_^!Gir=IZ0uiP z7K?;)FWA9f7G?(4?%Qgn90`h5zJ8aj6K4G{pdRhe zj~J}?Q`~EcrQ*T|)0TE6ioq}A(b_4dH;{4*5l`+ClT8OP*LT;fjDrW|I}#T1SMyq_ zSD?O69A5+N*HXUR>ELIEJ$@=SXUuaZO*PHmMjb<_i?39e=&y^v#;YB_8T}XC*q@E) zE!?}E%9iGsiO003F-NTY|6}bqS|{gnbT z@P~f`thhqJIG0-+y>}N^8vj-Qr0w$f%-Tijx@e<2YaIa zgr%pa$Z?a|>rd#>Ebp2veT8JD=P;L^VoOioBt3I)rO-(JLjCD^13zkLgdXpIr>7%* ziMA|CqU|Zs-)8yy8*JMzcgR$4AQ`qr40(uQbdbn0hQZ869Y*_2nshjty2);}me<{Q&N}C28 z@}V(CRt3=5i#to(VKd|Q>aUAbPzeIo(}R&*tZ(HK{w#c$TdC$n7Gv=(0D9Qb}SP5%s(YQ{Ho5* z{hJ7#J7(zqFyA~WWqBCzz3|{1A)fn2rMAQ@HyGU`U+g2 zS6rYb{q<}jbDK)C&2y;mLScgYWXuJ`w0ZU*QUqNczK}h0LR{0|2u2^_4|Q|q-%yE_ z6fvYVdM8mXp|M?>kDt@Os5-n2Bmw7GbG{I>v~g?qU}fXhc<`v|NPV_b{l0&~;y`g* zy@%sRv9}r*A0C#dpTq&K2Pd9pXaR-%+DsuA5+Mnlz!cjbLV^W>39r$g<|u8xhT(-- z!CcAFjG79@92+ubR?ZPNI;*b-(%ubFv`1 zD+{86on|51nN2@kc+g|w-QZ43_y|RHIm+m7oYF{I{N%(<(20z!r7h8C_DxdQ2&w!5-xkLF@Tif9tpNb=Q|NlII=eIA) zu@>Nu<0U2D!7Kg!9OY8puSQBEES0|!X}`7N4h2Fg&L4@`XY<(I8mVRnMs?b=dAUL` z575a*Vtla*Y0vU>o}9T7X0#JA+eBS*+#wz)x=(DeYy^KVnzAYAyO6f?mIs(MpRu8*{>*M~m@JT*VB3 zF7=kpyZ=Abjx%7vHsMreJvR9N>|Mfs2(cTBEC_Wpm%5~Hp^pr0ZhB={fHYN1CS<(hpjCW^Kbx2SRUg_-61Fg*RX`E+d1gl3^xlne$XmmiN}kOWizo$ za_HkAGn97HI4mdlVQg=yZ*zO+oyhknu^MoC6mn)4L~yms?#C*3%kJ4>Wp|GJ!0t#U ziIm-oh%gVrd_u5I%P{~^*6oO?p6?H1bxM26evhvx#YKFrMNEpvqV2&C=s>)2yHrbQ zo<^7|MO;767k{6~WwPVqZ^~OvNao_-zfp)9@C5O;y_o0FxODwtV7J(uCdLB(PP3p% z{(e`!Wq>sZ*6LJ&S)?csKe&ENF^**boz;DzDbEv>)KC@$< zl?E7IT7f&cR|3z_%UuMR#n(+?7j#qXkNKPyBHh;x_B>Mh)}25~JG+d5qF5gLi2nM>9da zmZ^z$wYSED{h_^x=Prk=I2tHG0ISdVxw+Yb1wTaY1==OosvO9XB@3H@pK<*;u%VJmE>3zs_5>LCasA!)hVgq zC%3ASEY%3pP3onwbj4VttFKq&%$EH52l3OgMLgIQW(bPJAVQRap&Ct%cWBjmjiEqV z4t-lI`#&ne^*qS8v4V5n;b?VuttkbZ`EXA8>v|_H1H*!E{0sP{5+&{WS@IK^$!b1N zj4$g)!3!WnR>*Ea)V{E6C&><-F2f(MIQUMzJo_gTV3e@Id;&P?LJ4ZhWm>nbQE&=+ zKW~AkGpBg*%*eXh9AohYSaj)J9cIVOSHWTCU!srFEY_PGqteLCYYzlSQ*l=lEAm}gEzdC!Nx&mG}z!9h!=>|1~K%TSt{18{KzOgZeGR|$sHLT z-X7dRUy}7-Qx)dK!JA>8E)KoVaNJxd$RqRbf>oWFF{^3ZjO|$I&;jeI2!R3gI;Ezf zunuJlo*Rg~TzDH0%wn28AgB&sRyZ*bKD%%dRTH2Jgu%7Yro0?)8qp7yJK-e;_m-DE zEid1pBC@IiJDbh-lpXz25wABJ36K(fkFYL!NshlIkRD_XRiq-IJCaCWYg7R}3{oqg ze}cpbwF~HZDbSz)NXYiAB(R8f{q6?S?*r|_Jxy@XkXr8}bW}14I;&7-t*d1Qev5jKsb$o(@r=~hDa#*uZ82YI zYe7c}AqBH{!KpYE$lpuQZLc>;icY5XzE0#Y^m|nlX|Hh(=FpDEC_(0o-!ybMD9nRU zCfgE^qpvfntONEWK4q`XYqa$p`nwC&g03+aTJU6l*F8zYP1h<73;D6ud%C5eU7LdW zV2jf5!x+oPmQ5_Cw9UQ|;n-$ZdK)P!H#yrTdm}EByQ)|67ohy{iWQSp+clmj8xuLO&yR!y!toKvDIP+d7LKw zBo%#{1x(80ca@X&{|zdSNBFVwxD=Kt?=7t)^BO$(8e2pFS$Yri`=?mRe9N_wWNRX5 za=_+_GE$2n5hxwH6fb)7$?K# z&tgfLBl4KPAdR+$2L7s6ICXWk(J9EkgFm6|g&y0_w9SnhWbCTbHs(7uTbyC<8POJ5 zJGTW?Sqsbfqvlxb|Ml8}*O;?})O1t$mTlTH`7;O`_?fhtaJibmeCe^SZ4)Di{hn)j z0vqGiO-_?qAElFWoBt3$YHHs0Ce{g*FNeGV7@Caz7Rt{nC^P2Fl z4f&TDS}UI=g?7|0lC;K*kTL2f?$nZcGXBKW(ks++2l?oH#SNZfigI7KJWmnlxAN2C zx76KC6}L4uC|yF?^g6BW+UPA*P0Aj)^HcjDru98z7wUT^Ji7|jJxTga^-B7!Nwu8* zGg#Rup%LZ-VTAX5YN+qdA~UV;!*J~Vjdc^Vf-JL@4ud*bm#}~*Xs9;&PZdF%DVKea z>~o-&cH&>kb*KT5yZla8YVzCpX<>dxJd%51%h8&!d}huMF}OWcIlP>B0pDXHUDv9f>Ps2o175$0#eHb&Gsyz~aoE2ERNe4}vr6=}5e*@2dh{-}L_ z=>|_Ih36iN=MR2bWakV#t&}$9J|Q;KCKpOEY&VwV$4G8`Nqn2EV2_IMGopre(q*k} zjGZNOa%>Enk{Z2AT3q^kT>NcT)8iASbqyb@j#$U_i+J0gr_;MJan9V;4W0)_CFSzg zbdhKNA;QmNmf)>Y*DgO#+T>d$`Ei^4Dao=JAZ~uMO`aynPuS#FRL7?01)QmRASXHp zMnr$z_AoG2_Q@7{K0htbSm>E)WglUaS4r}-HhDbBjW0EbEIG}{Sxi@pw0*GWE`7c+ z(Vz2H+H=)Oem}oj`5i7u*IJ~zNSTq+yU1jAfmrE-hBECiN}KC|28ka^o>U!)QD*%4 zA*My_!iN~C#Q1sursQgnSZ#e+OB;G7rHS7;o)v|^g3h|V!GZkR@vT4d%x&-_?&T1G z(faQ0{<5#-Y0J+c@3$(*sG}qj_oa~hWFZx{kUc2GHi_9k3M%nXnWxtd*R>yCAEd48 zSjKARIEzZ=eO^~1EB(c&tF(2ULVa3PC7>dHv__cQHxP14#|bG*g?Y6fKmLaO@Cf}o zjDN(Ra$lCd!E+d3u4Ndj<>WulPs=u23r*6FuU#r=0+G|0?qG=jxj6yS?A2Up+@$u8 zs=o$(JuG7vaA?_F2w|?-_(>~B7z@=YV^=3-blwlj*i?-$FIzTm9|>c*0Er45j~g-) zzL|)qCqBc!H~T|vx<2T9#4@!z+_QyIPw2y*$oG;Y8GpBA+y>t06j6l5d|Jh=oTlLi-&Qx#3; zB%0WFiYBhqn@Z3O;c@v*=AoZ7zVC^!eLa|@0(?}!>#ExW{s?FVB<-_#5KY`c{v*Vm zNRVm%3rA1N2p-R7vuLmxo4AVJeDu1gnuXT zykq$q2A+|#+*1=PZNzKzx?h3CoS;*p$3U67W5c34r ztpm73BTOze!tgv;N7Sdd6K1q@G}eFK{}u#{;=W3}`p+R0JY8Pv#eVIEQ4@LXW&u@R z!{KwG%2DJMwIm#b*p$!2E}Q6nkfJr0jQLuckTc*GN@RBxLQVG%tWbk{R~2s!cBv|! zo`-zHYeeKv0OosH9L?Cr6xc@?xdpm(6uU3P4N4Mowk2jMvbQ>U&$n#z>h@)@TY?Bq zla#)p$@((!?}_;6V<=iWJz@`KzKMZ`oYjvEJs2Zo4xwDP7G6-%hzLrUW+p>fLIkFW zQi&g~5#~Asu}H{ok%boH6)TpQ*9Z<{dIJ{j!6^anfr$2;B;K1W-V(^A8?X$$8AS|Y z@3G$MBBb~KZvPn_k+h<{6-E9eep+f#Bb<%nq?tM;W{53P8ufSL$*J!&X^OJ)3v#sO z)lwd;Y|;qxf-sg`v0YDF$nZZzUhd-|7o=#oNpa?X$4|>dOT$aj0%$_KT;^H&l{;vc zZH5ooa@Mm$fMskk@5>Muk~tDGE0bidn5<+zkR9=pQJIv_ zMn#lgBeYGiwEabBexGad3ZTK zM%wrlx<*qXdnp!J6ZTt$hF&J*>e8jE6QWB${#7~amE`Qx^~%`>Y7n3MC|ey~i|^_b zhJi^8k6R3HD}cDa|F9UIuo!+pQdS$s3hmcQn+$vY14+_V=bP=c19>62>0b1m>bX%; z5dJ*OskAt6Q>iADP9Z@jV$7{>64PUY(RDkebeHfdIyJOS3Ce#|%a<8|f2kcPJv@nE ztRi5L_`(;==Qv#%*$qK5gUmWA(V`0^(bZXWbxCxi#6AGj8r<8=w=M6lB(@a7-$EUq zV#uncOty0g)TV`5S-CWYN(37EPA>12E&uARelbbJpISPYq=fwAC;8D z>7;|Qkp!~|^kP`c=#Yv5#;{&Wd|Ll%^1+jCU)3LYUV2H||MM0;IX`hGrPvnv`IV{= z-671j$dzAfv1`y==-=N~?y)X)eiAe1YrbOX%S-^ht7=(E%(EY=>Jzi25$&8Z!&o0F;K6Q{k`?YCwX3TW>=-?GX~EnNN4b5nN zvUnc*9C92vOgK#_mqr-djriM=@xvv4-vmeI8F1R$vSe=IcF@WE>C7*n#wnd4*slV+ zd$UdEe24aTF8MNg2L5sY5JHQzUEY5e89JrI1j}BQ#si@xH%ZHTQq@UAVGc~v!gTV` zZh*zQyYs((o|u8{-u~ioc_Hz?W5GA;6LE-b)swz5 z{1HlRf28AWakgIo9;#Wj6RM}%mUo>Xy#S=Za#YoGvZ4~n9xqhy2NG3K?d~pDD>dLW zU}8PRpQC}qPoaX;Ro#dXjvz_19t6tdc?GZ?V+(h{N8#HM6S+N7xcM?!_y?aRs`W=K zk?wL$6}~}wC1=3uW8p$pNf;R~C07UkZc3guTXV9Ks&suzN&f^&>AHo|GV2%O<|Rrq z7m-X)b(s|6ctT2#%9Z^Wo|_~#GIW~$l-BT58y&t@hMNhcciXE~W@&O}wlyBAKfzH| zkttHoKP|Z<)62~CRQBG< z?6=zNA0@LlTI5z=qkBPiMt!;RlEtV!z$cv>yXpp)cOy@6`Tn!#!Ad*(=md;k)5YXpk~<9rG5R=2{L4?ow? zd<`jzL)L;Kep3U0p;PGcY^$QzXqzp_{1a&p)$y@347;(Z(&id1qmC;K|$c0>8e-mkX8m z;K_l=*@ZPYAWy_OgWY0>rP`P6sAqtmdX$|bo3T1lh2JDGhF+=; zKdVT5ZL_oxC`ahC3L6yhdb10Nlf$t85U?UT5G6spHzOjen!8gBea!8xoB-KUnH`VG z^wiX3{>^Yt{$rB)*MG{eE$w)fdp_9CPcT1e9)Vanj)e+}wG=V#kJV|pM6^?=qhQgZ zdq5d8{}(|Z>mrm{?sJo=1Z0T*-6Otp9ufy({pZr@`BLo z+}R+1Zj`UT_otsyW6fO|8O@z)KXudgV9Q5|?Ga_(;#;x$s@@OS zx@(@8;NmQ35w3p&o|9&o+cQ%7B=$n>oB13%5TaD^tx2@i7VYtHYK4e}e;NL;$uio|%&OaOz{)gcR{ayilyEQA@6 zmBsd~t+hA!v4mX;wiJ`e`6S`b>}BcM4|*0PF-*1?$`ka|MvFj!P1u2-jQZ#*9**vf z3A*+1C_+GR$AJCJB=)`*d)7q>`c|&C^>MMlbHGms|AdjiUMf&~{SMupYrlCfwN7gP zadKmiWJ@_F=sBX~eTL2EXv%Edn(e)9F{kgisC5zq>;nO-iMIm!)hcJU(ve?xAlDLkuxUR6cR;o6eW^ic_`7_Ae;x_U4a z?=BtFQglpAg3hv_ujx;IJ3olwgO8LB^LHR*8zN^$4o2LEC!t1JsGBX+^XDqmy+En` zalO*C@u;gGBEVuxMIj7)!KanRcEk?@7g&4__@dWBwzx?ue`Tgr6oE;am)5F0V_=w@ z#PG7ku%E?nFhB6o6N;=EjCDs6U`$xmMHYv&^|O;W>MV{m`jfwQyy95#VFCv>QoG;u z{(<%8e!L6J9xhlLXOT+XbWI|amjPhyQHyjwNMrSE&#Y{Bd5VNqiH<%&gQ~)xvgvO|8S`uGDyxn5f~*9;avz(l*9mdKZVaDuK+0`6k^C&hUb@aTsSH(qL&Uv`W)8{gxEOrlu4H3eQkh+NY<9ZXSzxbVL zd&OHTinmPZTM_=z&~VKr z*pp3ZO<&dR=Zn8Os1wq2z(%-D!jAK=)_c4S+7nPww3i}!$w(O$*OXf;|RlKox$FS7k%Izs5l?s7R3;! zOT?AcZIru!q^)v!Ll5cm>fc}jX?aWG#XVYwum^L!d5y9tYEEl5Wlmr#xRm>h1j4lo zD#Bk@g+uciw-k79e4MxwBNfBeqP&Qc9c``bmaLr5`LLutsq{V{%41U?|8Fl?Ae2;j zkKgd3Et<8}AH>LQqxX}iqI$_oR87TF6x+^kD9h&f#G(3V6w&*-(N0+oI=Q>A_=LV} z&nGg&|5+e>u#e~acpvImh8(|}Utk@O-LOM!@S>VTHDc`?cY6zZC~AI%cToYl+PJnG zR>%%`(uDu2bj~7#EoAp?dbLxi4}bGQ$H|0s0OZlxB%q;*!sBU$PqT#&*TTQOz!rW5 zg~$Gq2C+R2qS8Wim%&?%qGJc^K6fYE?*w=pqpFY%mYkF3Sq7(mo_XbMkwDUatj_+G z6U(jM*^TU_iOE{W2kJ1It>lwc{l5z{8JZ$%RhN-T40`GA*1gQg5M2Z;XDe9q zOdAw>o=XTspO?yP^PI=G{Nr=9`Z`o0m8P%qrdG9h2Clw_YUTDh`!dEH zw7(&t1Xcr`SF}vD@CvwLulBA!?+ab5qJ{R2U9D;{3!#fno{m1McvJNm$o@=-oP9nd z$1Y|odE$zf&E_K-IJJ_eH74Wlet=6AKM#2#>8wMTr5jC_7Ag*>Xv>>6-mu0PJ9?St zZGKUz$_Dfc(tEBV%p}(eegw^xE}9o5+8J>83R|Tmwe6w3xg~!FUFxLPQS!9}g{n)L zo~33OZicmc8TPJ*J?H4hkXAed@2mpkZd=)0YR8NNhL_)D=O6_e&4GPVAlxK_U49z)@x|Y&@ILwTiIE&By3V((=`LbXk5?qWudOmqf`PWm zT=!RgB)-TE7r4Lu34omUKk;7SDux!88<0VqLZqjT;H|Ft zTmI=b<~E`?vCnnK{-!oMRpOK5^FPziVXA|^@JF0E3~+AUsjo40GzV81k3B~#;Y0k0 zmOkhc$~YSmtDWb>C{&j`CzOYF^)4(|QLYQ(>5$EFYT% zG(9e!sV)iC1=)FMZA<4Sk(mfAX>SsiMVfl=

mldMzsx;g?zA?+KMk?mASD@;Y?d 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

>JNtOW9>{X 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 JVeB6I_ir6QV3+^^ diff --git a/epics/clibs/darwin64/libComPYEPICS.dylib b/epics/clibs/darwin64/libComPYEPICS.dylib new file mode 100755 index 0000000000000000000000000000000000000000..b688090e2680a67902c11d83762722ed974d0029 GIT binary patch literal 565564 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

tmP}Ak@5!AW57bxB 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