text:
This project includes an implementation of SCReAM, a mobile optimised congestion control algorithm for realtime interactive media.

## Algorithm
SCReAM (**S**elf-**C**locked **R**at**e** **A**daptation for **M**ultimedia) is a congestion control algorithm devised mainly for Video.
Congestion control for WebRTC media is currently being standardized in the IETF RMCAT WG, the scope of the working group is to define requirements for congestion control and also to standardize a few candidate solutions.
SCReAM is a congestion control candidate solution for WebRTC developed at Ericsson Research and optimized for good performance in wireless access.

The algorithm is an IETF experimental standard [1], a Sigcomm paper [2] and [3] explains the rationale behind the design of the algorithm in more detail. A comparison against GCC (Google Congestion Control) is shown in [4]. Final presentations are found in [5] and [6]. A short [video](https://www.youtube.com/watch?v=_jBFu-Y0wwo) exemplifies the use of SCReAM in a small vehicle, remote controlled over a public LTE network. [7] explains the rationale behind the use of SCReAM in remote controlled applications over LTE/5G.

Unlike many other congestion control algorithms that are rate based i.e. they estimate the network throughput and adjust the media bitrate accordingly, SCReAM is self-clocked which essentially means that the algorithm does not send in more data into a network than what actually exits the network.

To achieve this, SCReAM implements a feedback protocol over RTCP that acknowledges received RTP packets.
A congestion window is determined from the feedback, this congestion window determines how many RTP packets that can be in flight i.e. transmitted by not yet acknowledged, an RTP queue is maintained at the sender side to temporarily store the RTP packets pending transmission, this RTP queue is mostly empty but can temporarily become larger when the link throughput decreases.
The congestion window is frequently adjusted for minimal e2e delay while still maintaining as high link utilization as possible. The use of self-clocking in SCReAM which is also the main principle in TCP has proven to work particularly well in wireless scenarios where the link throughput may change rapidly. This enables a congestion control which is robust to channel jitter, introduced by e.g. radio resource scheduling while still being able to respond promptly to reduced link throughput.
SCReAM is optimized in house in a state of the art LTE system simulator for optimal performance in deployments where the LTE radio conditions are limiting. In addition, SCReAM is also optimized for good performance in simple bottleneck case such as those given in home gateway deployments. SCReAM is verified in simulator and in a testbed to operate in a rate range from ~20kbps up to 100Mbps.
The fact that SCReAM maintains a RTP queue on the sender side opens up for further optimizations to congestion, for instance it is possible to discard the contents of the RTP queue and replace with an I frame in order to refresh the video quickly at congestion.

Below is shown an example of SCReAM congestion control when subject to a bottleneck with varying bandwidth.

![Simple bottleneck simulation SCReAM](https://github.com/EricssonResearch/scream/blob/master/images/image_2.png)

Figure 1 : Simple bottleneck simulation SCReAM

## ECN (Explicit Congestion Notification)
SCReAM supports "classic" ECN, i.e. that the sending rate is reduced as a result of one or more ECN marked RTP packets in one RTT, similar to the guidelines in RFC3168. .

In addition SCReAM also supports L4S, i.e that the sending rate is reduced proportional to the fraction of the RTP packets that are ECN marked. This enables lower network queue delay.

Below is shown three simulation examples with a simple 50Mbps bottleneck that changes to 25Mbps after 50s, the min RTT is 20ms. The video trace is from NVENC.

The graphs show that ECN improves on the e2e delay and that the use of L4S reduces the delay considerably more.

L4S gives a somewhat lower media rate, the reason is that a larger headroom is added to ensure the low delay, considering the varying output rate of the video encoder. This is self-adjusting by inherent design, the average bitrate would increase if the frame size variations are smaller.

Note carefully that the scales in the graphs differ, especially the delay graph is zoomed in for the L4S alternative to illustrate the very low queue delay. It is obvious that L4S gives a much lower queue delay.

![Simple bottleneck simulation SCReAM no ECN support](https://github.com/EricssonResearch/scream/blob/master/images/scream_noecn_2.png)

Figure 2 : SCReAM without ECN support

![Simple bottleneck simulation SCReAM with ECN support](https://github.com/EricssonResearch/scream/blob/master/images/scream_ecn_2.png)

Figure 3 : SCReAM with ECN support ECN beta = 0.8. CoDel with default settings (5ms, 100ms)

![Simple bottleneck simulation SCReAM with L4S support](https://github.com/EricssonResearch/scream/blob/master/images/scream_l4s_2.png)

Figure 4 : SCReAM with L4S support. L4S ramp-marker (Th_low=2ms, Th_high=10ms)

----------

The two videos below show a simple test with a simple 3Mbps bottleneck (CoDel AQM, ECN cabable). The first video is with ECN disabled in the sender, the other is with ECN enabled. SCReAM is here used with a Panasonic WV-SBV111M IP camera. One may argue that one can disable CoDel to avoid the packet losses, unfortunately one then lose the positive properties with CoDel, mentioned earlier.

[Without ECN](https://www.youtube.com/watch?v=J0po78q1QkU "Without ECN")

[With ECN](https://www.youtube.com/watch?v=qIe0ubw9jPw "With ECN")

The green areas that occur due to packet loss is an artifact in the conversion of the RTP dump.
## Real life test
A real life test of SCReAM is performed with the following setup in a car:

- Sony Camcorder placed on dashboard, HDMI output used
- Antrica ANT-35000A video encoder with 1000-8000kbps encoding range and 1080p50 mode
- Laptop with a SCReAM sender running
- Sony Xperia phone in WiFi tethering mode

A SCReAM receiver that logged the performance and stored the received RTP packets was running in an office. The video traffic was thus transmitted in LTE uplink.The video was played out to file with GStreamer, the jitter buffer was disabled to allow for the visibility of the delay jitter artifacts,

Below is a graph that shows the bitrate, the congestion window and the queue delay.

![Log from ](https://github.com/EricssonResearch/scream/blob/master/images/SCReAM_LTE_UL.png)

Figure 5 : Trace from live drive test

The graph shows that SCReAM manages high bitrate video streaming with low e2e delay despite demanding conditions both in terms of variable throughput and in a changing output bitrate from the video encoder. Packet losses occur relatively frequently, the exact reason is unknown but seem to be related to handover events, normally packet loss should not occure in LTE-UL, however this seems to be the case with the used cellphone.
The delay increases between 1730 and 1800s, the reason here is that the available throughput was lower than the lowest possible coder bitrate. An encoder with a wider rate range would be able to make it possible to keep the delay low also in this case.

A video from the experiment is found at the link below. The artifacts and overall video quality can be correlated aginst the graph above.

Link to video : [SCReAM live demo](https://youtu.be/YYaox26WhKo "SCReAM Live demo")

SCReAM is also implemented in a remote controlled car prototype. The two videos below show how it works in different situations

- [Boliden Kankberg mine](https://www.youtube.com/watch?v=r7QxdTP3jB0 "Boliden Kankberg mine")
- [Winter wonderland](https://www.youtube.com/watch?v=eU1crtEvMv4 "Winter wonderland")

## The code
The main SCReAM algorithm components are found in the C++ classes:

- ScreamTx : SCReAM sender algorithm

- ScreamRx : SCReAM receiver algorithm

A few support classes for experimental use are implemented in:

- RtpQueue : Rudimentary RTP packet queue

- VideoEnc : A very simple model of a Video encoder

- NetQueue : Simple delay and bandwidth limitation

For more information on how to use the code in multimedia clients or in experimental platforms, please see [https://github.com/EricssonResearch/scream/blob/master/SCReAM-description.pptx](https://github.com/EricssonResearch/scream/blob/master/SCReAM-description.pptx?raw=true)

## References
[1] https://tools.ietf.org/html/rfc8298

[2] Sigcomm paper http://dl.acm.org/citation.cfm?id=2631976

[3] Sigcomm presentation http://conferences.sigcomm.org/sigcomm/2014/doc/slides/150.pdf

[4] IETF RMCAT presentation, comparison against Google Congestion Control (GCC) http://www.ietf.org/proceedings/90/slides/slides-90-rmcat-3.pdf

[5] IETF RMCAT presentation (final for WGLC) : https://www.ietf.org/proceedings/96/slides/slides-96-rmcat-0.pdf

[6] IETF RMCAT presention , SCReAM for remote controlled vehicles over 4G/5G : https://datatracker.ietf.org/meeting/100/materials/slides-100-rmcat-scream-experiments

[7] Adaptive Video with SCReAM over LTE for Remote-Operated Working Machines : https://www.hindawi.com/journals/wcmc/2018/3142496/

## Feedback format
The feedback format is according to [https://tools.ietf.org/html/draft-ietf-avtcore-cc-feedback-message-02](https://tools.ietf.org/html/draft-ietf-avtcore-cc-feedback-message-02 "IETF feedback format"), a previous proprietary format is deprecated.
The feedback overhead depends on the media bitrate. The table below shows the IP+UDP+RTCP bitrate at varuious media bitrates.

       +-----------------------------------------------------+
       | Media bitrate [kbps] | RTCP feedback bitrate [kbps] |
       +-----------------------------------------------------+
       |                   50 |                           15 |
       |                  100 |                           15 |
       |                  500 |                           30 |
       |                 1000 |                           60 |
       |                10000 |                          300 |
       |                30000 |                          500 |
       +-----------------------------------------------------+

## Build
The SCReAM code comes in two (three) applications

- Windows based test application : This application implements a simple bottleneck and does only local simulation. Open the scream.sln application in Visual studio and build.
- Linux based BW test application :  Makes in possible to benchmark the throughput live networks and test beds. The tool models a video encoder. See https://github.com/EricssonResearch/scream/blob/master/SCReAM-description.pptx for further instructions.
- gstreamer plugin : This application is kept in ./gstscream. See ./gstscream/README.md for details.

### Build SCReAM BW test application

The SCReAM BW test application runs on e.g Ubuntu 16.04 and later. The build steps are:

```
cmake .
make
```

You need git, cmake, make and g++ installed


text:
/**
 * Default implementations of HTTP connections for synchronous,
 * blocking communication.
 */
package org.apache.http.impl;

redpajama_set_name: RedPajamaGithub


text:
(function() {
  "use strict"

  // Make a synchronous HTTP request for a module.
  function get(url) {
    var xhr = new XMLHttpRequest()
    xhr.open("get", url, false)
    xhr.send()
    if (xhr.status >= 400) throw new Error(url + ": " + xhr.statusText)
    return {url: xhr.responseURL || xhr.getResponseHeader("X-Request-URL"),
            content: xhr.responseText}
  }

  // A key-value map of all loaded modules.
  var loaded = Object.create(null)

  // Resolve a submodule path with its parent module's,
  // resulting in module path relative to the root module.
  function resolve(base, name) {
    base = base.slice(0, base.lastIndexOf("/") + 1)
    var rel = /^\.(\.?)\//, m
    while (m = rel.exec(name)) {
      if (m[1]) {
        var end = /\/([^\/]+)\/$/.exec(base)
        if (end && end[1] != "..") base = base.slice(0, base.length - end[0].length + 1)
        else base += "../"
      }
      name = name.slice(m[0].length)
    }
    return base + name
  }

  // A cache of resolved module paths.
  var resolved = Object.create(null)

  // A module, which can load submodules.
  function Module(path, base) {
    this.exports = {}
    // Load a submodule of this module.
    this.require = function(name) {
      if (/^\./.test(name)) name = resolve(path, name)
      else if (/^\//.test(name)) name = resolve("", name);
      else name = path + "/__mod/" + name
      if (name in resolved) name = resolved[name]
      if (name in loaded) return loaded[name]
      // Modify the module path for the request,
      // changing up one directory ("..") to "__".
      var resp = get(base + name.replace(/(^|\/)\.\.(?=$|\/)/g, "$1__").replace(/\.js$/, ""))
      var resolvedName = resp.url.match(/.*?\/moduleserve\/mod(\/.*)/)[1].replace(/(^|\/)__(?=$|\/)/g, "$1..")
      if (resolvedName != name) resolved[name] = resolvedName
      name = resolvedName
      if (name in loaded) return loaded[name]
      if (/\.json$/.test(name))
        return loaded[name] = JSON.parse(resp.content)
      // Create the module and evaluate its code,
      // which recursively loads submodules.
      var mod = new Module(name, base)
      loaded[name] = mod.exports
      evalFunction(resp.content, name)(mod, mod.require, mod.exports)
      return loaded[name] = mod.exports
    }
  }

  // Wrap JavaScript module code in a module encapsulating function
  // and return the function, evaluated.
  function evalFunction(content, name) {
    var prefix = "(function(module, require, exports){", suffix = "\n})"
    if (!/\/\/#/.test(content)) content += "\n//# sourceURL=" + name
    return (0, eval)(prefix + content + suffix)
  }

  var script = document.currentScript || document.querySelector("script[data-module]")
  var base = /^(.*)\/load\.js$/.exec(script.src)[1] + "/mod"
  // Create a root module and require the main module
  // defined in the "data-module" attribute.
  var top = new Module(document.location.pathname, base)

  if (script.hasAttribute("data-require"))
    window[script.getAttribute("data-require") || "require"] = top.require
  top.require(script.getAttribute("data-module"))
})()


text:
'use strict';
angular.module('marketplace-credentials', ['ngStorage'])
    .controller('MarketplaceCredentialsController', ['$scope', '$state', '$http', '$localStorage', '$rootScope', '$sce',
        function ($scope, $state, $http, $localStorage, $rootScope, $sce) {
            $scope.showCredsForm = false;
            $scope.user = {
                username : $localStorage.marketplaceUsername ? $localStorage.marketplaceUsername : '',
                password : '',
                submitted : false
            };

            $scope.upgradeProcessError = false;

            $http.get('index.php/select-version/installedSystemPackage', {'responseType' : 'json'})
                .success(function (data) {
                    if (data.responseType == 'error') {
                        $scope.upgradeProcessError = true;
                        $scope.upgradeProcessErrorMessage = $sce.trustAsHtml(data.error);
                    } else {
                        if (!$rootScope.authRequest || !$rootScope.isMarketplaceAuthorized) {
                            $scope.isHiddenSpinner = false;
                            $http.post('index.php/marketplace/check-auth', [])
                                .success(function (response) {
                                    if (response.success) {
                                        $localStorage.marketplaceUsername = $scope.user.username = response.data.username;
                                        $localStorage.isMarketplaceAuthorized = true;
                                        $scope.nextState();
                                    } else {
                                        $localStorage.isMarketplaceAuthorized = false;
                                        $scope.showCredsForm = true;
                                    }
                                    $rootScope.isMarketplaceAuthorized = $localStorage.isMarketplaceAuthorized;
                                    $rootScope.authRequest = true;
                                });
                        } else {
                            $rootScope.isMarketplaceAuthorized = $localStorage.isMarketplaceAuthorized;
                            $scope.nextState();
                        }
                    }
                })
                .error(function (data) {
                    $scope.upgradeProcessError = true;
                });

            $scope.errors = false;

            $scope.saveAuthJson = function () {
                if ($scope.auth.$valid) {
                    $http.post('index.php/marketplace/save-auth-json', $scope.user)
                        .success(function (data) {
                            $scope.saveAuthJson.result = data;
                            if ($scope.saveAuthJson.result.success) {
                                $scope.logout = false;
                                $localStorage.isMarketplaceAuthorized = true;
                                $scope.errors = false;
                                $scope.nextState();
                            } else {
                                $localStorage.isMarketplaceAuthorized = false;
                                $scope.errors = true;
                            }
                            $rootScope.isMarketplaceAuthorized = $localStorage.isMarketplaceAuthorized;
                            $localStorage.marketplaceUsername = $scope.user.username;
                        })
                        .error(function (data) {
                            $scope.saveAuthJson.failed = data;
                            $localStorage.isMarketplaceAuthorized = false;
                            $scope.errors = true;

                        });
                } else {
                    $scope.validate();
                }
            };

            $scope.validate = function() {
                if ($scope.user.$valid) {
                    $scope.user.submitted = false;
                } else {
                    $scope.user.submitted = true;
                }
            }
        }]);


text:
package com.dianping.cat.alarm.spi.config;

import java.util.ArrayList;
import java.util.List;

import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException;
import org.unidal.dal.jdbc.DalNotFoundException;
import org.unidal.lookup.annotation.Inject;
import org.unidal.lookup.annotation.Named;

import com.dianping.cat.Cat;
import com.dianping.cat.alarm.policy.entity.AlertPolicy;
import com.dianping.cat.alarm.policy.entity.Group;
import com.dianping.cat.alarm.policy.entity.Level;
import com.dianping.cat.alarm.policy.entity.Type;
import com.dianping.cat.alarm.policy.transform.DefaultSaxParser;
import com.dianping.cat.alarm.spi.AlertChannel;
import com.dianping.cat.config.content.ContentFetcher;
import com.dianping.cat.core.config.Config;
import com.dianping.cat.core.config.ConfigDao;
import com.dianping.cat.core.config.ConfigEntity;

@Named
public class AlertPolicyManager implements Initializable {

	private static final String CONFIG_NAME = "alertPolicy";

	private static final String DEFAULT_TYPE = "default";

	private static final String DEFAULT_GROUP = "default";

	@Inject
	private ConfigDao m_configDao;

	@Inject
	private ContentFetcher m_fetcher;

	private int m_configId;

	private AlertPolicy m_config;

	public AlertPolicy getAlertPolicy() {
		return m_config;
	}

	@Override
	public void initialize() throws InitializationException {
		try {
			Config config = m_configDao.findByName(CONFIG_NAME, ConfigEntity.READSET_FULL);
			String content = config.getContent();

			m_configId = config.getId();
			m_config = DefaultSaxParser.parse(content);
		} catch (DalNotFoundException e) {
			try {
				String content = m_fetcher.getConfigContent(CONFIG_NAME);
				Config config = m_configDao.createLocal();

				config.setName(CONFIG_NAME);
				config.setContent(content);
				m_configDao.insert(config);

				m_configId = config.getId();
				m_config = DefaultSaxParser.parse(content);
			} catch (Exception ex) {
				Cat.logError(ex);
			}
		} catch (Exception e) {
			Cat.logError(e);
		}
		if (m_config == null) {
			m_config = new AlertPolicy();
		}
	}

	public boolean insert(String xml) {
		try {
			m_config = DefaultSaxParser.parse(xml);

			return storeConfig();
		} catch (Exception e) {
			Cat.logError(e);
			return false;
		}
	}

	public List<AlertChannel> queryChannels(String typeName, String groupName, String levelName) {
		try {
			Level level = queryLevel(typeName, groupName, levelName);
			if (level == null) {
				return new ArrayList<AlertChannel>();
			} else {
				String send = level.getSend();
				String[] sends = send.split(",");
				List<AlertChannel> channels = new ArrayList<AlertChannel>();

				for (String str : sends) {
					AlertChannel channel = AlertChannel.findByName(str);

					if (channel != null) {
						channels.add(channel);
					}
				}

				return channels;
			}
		} catch (Exception ex) {
			return new ArrayList<AlertChannel>();
		}
	}

	private Level queryLevel(String typeName, String groupName, String levelName) {
		Type type = m_config.findType(typeName);

		if (type == null) {
			type = m_config.findType(DEFAULT_TYPE);
		}

		Group group = type.findGroup(groupName);

		if (group == null) {
			group = type.findGroup(DEFAULT_GROUP);
		}

		return group.findLevel(levelName);
	}

	public int queryRecoverMinute(String typeName, String groupName, String levelName) {
		try {
			Level level = queryLevel(typeName, groupName, levelName);

			if (level == null) {
				return 1;
			} else {
				return level.getRecoverMinute();
			}
		} catch (Exception ex) {
			return 1;
		}
	}

	public int querySuspendMinute(String typeName, String groupName, String levelName) {
		try {
			Level level = queryLevel(typeName, groupName, levelName);

			if (level == null) {
				return 0;
			} else {
				return level.getSuspendMinute();
			}
		} catch (Exception ex) {
			return 0;
		}
	}

	private boolean storeConfig() {
		synchronized (this) {
			try {
				Config config = m_configDao.createLocal();

				config.setId(m_configId);
				config.setKeyId(m_configId);
				config.setName(CONFIG_NAME);
				config.setContent(m_config.toString());
				m_configDao.updateByPK(config, ConfigEntity.UPDATESET_FULL);
			} catch (Exception e) {
				Cat.logError(e);
				return false;
			}
		}
		return true;
	}

}


text:
layout: page
title: Ruby Holdings Trade Fair
date: 2016-05-24
author: Anna Simmons
tags: weekly links, java
status: published
summary: Morbi placerat, massa nec porta condimentum, nulla.
banner: images/banner/meeting-01.jpg
booking:
  startDate: 02/24/2017
  endDate: 02/26/2017
  ctyhocn: MTYGAHX
  groupCode: RHTF
published: true
---
Donec ut vehicula ante. Nulla facilisi. Sed leo diam, imperdiet id fringilla at, tristique finibus felis. Nullam nec suscipit nisi, quis vestibulum velit. Nam scelerisque porta nisl nec feugiat. Fusce fringilla maximus nulla, eu scelerisque orci elementum nec. Donec nec mauris in erat auctor commodo quis in massa. Maecenas id est egestas quam tincidunt viverra. Etiam justo elit, fringilla ultricies porttitor eu, malesuada eget justo. Curabitur quis sollicitudin erat, at laoreet purus. Maecenas risus tortor, aliquet a mauris in, cursus iaculis risus. Ut semper, justo at accumsan fermentum, nisl nibh rutrum felis, vel faucibus lacus justo id magna.

* Phasellus faucibus felis ut lectus accumsan vestibulum
* Sed vitae mi auctor, tristique elit at, rhoncus ipsum
* Pellentesque aliquet elit a erat vehicula, et aliquet elit elementum
* Donec id quam egestas, tincidunt ipsum id, hendrerit eros.

Nullam dapibus efficitur laoreet. Sed nisl lectus, interdum quis erat eu, lacinia lobortis sem. Maecenas laoreet dui vel lorem pretium, a efficitur massa vestibulum. Aliquam at semper justo. Vestibulum lacus mauris, viverra in facilisis ut, condimentum at ante. Duis ac orci aliquam dolor varius elementum vitae eu elit. Mauris vitae elit ut risus vehicula lobortis. Aenean a ipsum nulla. Integer porta ornare diam et gravida. Donec nec nulla efficitur, ultrices augue sit amet, bibendum nisl. Aenean bibendum diam sit amet dui pellentesque convallis. Sed ultricies eros et lacus semper, id vulputate purus elementum. Nam tristique accumsan est, pellentesque feugiat ligula elementum ut. Suspendisse varius, nisl eu pulvinar pulvinar, mauris nisi lacinia turpis, eu egestas tellus augue et magna.


text:
/**
 */
package gluemodel.COSEM.InterfaceClasses;

import org.eclipse.emf.ecore.EFactory;

/**
 *
 * The Factory for the model.
 * It provides a create method for each non-abstract class of the model.
 *
 * @see gluemodel.COSEM.InterfaceClasses.InterfaceClassesPackage
 * @generated
 */
public interface InterfaceClassesFactory extends EFactory {
	/**
	 * The singleton instance of the factory.
	 *
	 *
	 * @generated
	 */
	InterfaceClassesFactory eINSTANCE = gluemodel.COSEM.InterfaceClasses.impl.InterfaceClassesFactoryImpl.init();

	/**
	 * Returns a new object of class 'SFSK PHY MA Csetup'.
	 *
	 *
	 * @return a new object of class 'SFSK PHY MA Csetup'.
	 * @generated
	 */
	S_FSK_PHY_MACsetup createS_FSK_PHY_MACsetup();

	/**
	 * Returns a new object of class 'SFSK Activeinitiator'.
	 *
	 *
	 * @return a new object of class 'SFSK Activeinitiator'.
	 * @generated
	 */
	S_FSKActiveinitiator createS_FSKActiveinitiator();

	/**
	 * Returns a new object of class 'SFSKMA Csynctimeouts'.
	 *
	 *
	 * @return a new object of class 'SFSKMA Csynctimeouts'.
	 * @generated
	 */
	S_FSKMACsynctimeouts createS_FSKMACsynctimeouts();

	/**
	 * Returns a new object of class 'SFSKMA Ccounters'.
	 *
	 *
	 * @return a new object of class 'SFSKMA Ccounters'.
	 * @generated
	 */
	S_FSKMACcounters createS_FSKMACcounters();

	/**
	 * Returns a new object of class 'IEC61334 432LL Csetup'.
	 *
	 *
	 * @return a new object of class 'IEC61334 432LL Csetup'.
	 * @generated
	 */
	IEC61334_4_32LLCsetup createIEC61334_4_32LLCsetup();

	/**
	 * Returns a new object of class 'SFSK Reportingsystemlist'.
	 *
	 *
	 * @return a new object of class 'SFSK Reportingsystemlist'.
	 * @generated
	 */
	S_FSKReportingsystemlist createS_FSKReportingsystemlist();

	/**
	 * Returns a new object of class 't61334 32 LLC SSCS setup'.
	 *
	 *
	 * @return a new object of class 't61334 32 LLC SSCS setup'.
	 * @generated
	 */
	t61334_32_LLC_SSCS_setup createt61334_32_LLC_SSCS_setup();

	/**
	 * Returns a new object of class 'PRIME NB OFDM PLC Phy layer counters'.
	 *
	 *
	 * @return a new object of class 'PRIME NB OFDM PLC Phy layer counters'.
	 * @generated
	 */
	PRIME_NB_OFDM_PLC_Phy_layer_counters createPRIME_NB_OFDM_PLC_Phy_layer_counters();

	/**
	 * Returns a new object of class 'PRIME NB OFDM PLC MA Csetup'.
	 *
	 *
	 * @return a new object of class 'PRIME NB OFDM PLC MA Csetup'.
	 * @generated
	 */
	PRIME_NB_OFDM_PLC_MACsetup createPRIME_NB_OFDM_PLC_MACsetup();

	/**
	 * Returns a new object of class 'PRIME NB OFDM PLC MAC counters'.
	 *
	 *
	 * @return a new object of class 'PRIME NB OFDM PLC MAC counters'.
	 * @generated
	 */
	PRIME_NB_OFDM_PLC_MAC_counters createPRIME_NB_OFDM_PLC_MAC_counters();

	/**
	 * Returns a new object of class 'PRIME NB OFDM PLC MAC functionalparams'.
	 *
	 *
	 * @return a new object of class 'PRIME NB OFDM PLC MAC functionalparams'.
	 * @generated
	 */
	PRIME_NB_OFDM_PLC_MAC_functionalparams createPRIME_NB_OFDM_PLC_MAC_functionalparams();

	/**
	 * Returns a new object of class 'PRIME NB OFDM PLC MA Cnetworkadmindata'.
	 *
	 *
	 * @return a new object of class 'PRIME NB OFDM PLC MA Cnetworkadmindata'.
	 * @generated
	 */
	PRIME_NB_OFDM_PLC_MACnetworkadmindata createPRIME_NB_OFDM_PLC_MACnetworkadmindata();

	/**
	 * Returns a new object of class 'PRIME NB OFDM PLC Application identification'.
	 *
	 *
	 * @return a new object of class 'PRIME NB OFDM PLC Application identification'.
	 * @generated
	 */
	PRIME_NB_OFDM_PLC_Application_identification createPRIME_NB_OFDM_PLC_Application_identification();

	/**
	 * Returns a new object of class 'G3 PLC MAC layer counters'.
	 *
	 *
	 * @return a new object of class 'G3 PLC MAC layer counters'.
	 * @generated
	 */
	G3_PLC_MAC_layer_counters createG3_PLC_MAC_layer_counters();

	/**
	 * Returns a new object of class 'G3 PLC MAC setup'.
	 *
	 *
	 * @return a new object of class 'G3 PLC MAC setup'.
	 * @generated
	 */
	G3_PLC_MAC_setup createG3_PLC_MAC_setup();

	/**
	 * Returns a new object of class 'G3 PLC 6Lo WPAN'.
	 *
	 *
	 * @return a new object of class 'G3 PLC 6Lo WPAN'.
	 * @generated
	 */
	G3_PLC_6LoWPAN createG3_PLC_6LoWPAN();

	/**
	 * Returns a new object of class 'Zig Bee SAS startup'.
	 *
	 *
	 * @return a new object of class 'Zig Bee SAS startup'.
	 * @generated
	 */
	ZigBee_SAS_startup createZigBee_SAS_startup();

	/**
	 * Returns a new object of class 'Zig Bee SAS join'.
	 *
	 *
	 * @return a new object of class 'Zig Bee SAS join'.
	 * @generated
	 */
	ZigBee_SAS_join createZigBee_SAS_join();

	/**
	 * Returns a new object of class 'Zig Bee SAS APS fragmentation'.
	 *
	 *
	 * @return a new object of class 'Zig Bee SAS APS fragmentation'.
	 * @generated
	 */
	ZigBee_SAS_APS_fragmentation createZigBee_SAS_APS_fragmentation();

	/**
	 * Returns a new object of class 'Zig Beenetworkcontrol'.
	 *
	 *
	 * @return a new object of class 'Zig Beenetworkcontrol'.
	 * @generated
	 */
	ZigBeenetworkcontrol createZigBeenetworkcontrol();

	/**
	 * Returns a new object of class 'Zig Beetunnelsetup'.
	 *
	 *
	 * @return a new object of class 'Zig Beetunnelsetup'.
	 * @generated
	 */
	ZigBeetunnelsetup createZigBeetunnelsetup();

	/**
	 * Returns a new object of class 'TCP UD Psetup'.
	 *
	 *
	 * @return a new object of class 'TCP UD Psetup'.
	 * @generated
	 */
	TCP_UDPsetup createTCP_UDPsetup();

	/**
	 * Returns a new object of class 'IPv4setup'.
	 *
	 *
	 * @return a new object of class 'IPv4setup'.
	 * @generated
	 */
	IPv4setup createIPv4setup();

	/**
	 * Returns a new object of class 'IPv6setup'.
	 *
	 *
	 * @return a new object of class 'IPv6setup'.
	 * @generated
	 */
	IPv6setup createIPv6setup();

	/**
	 * Returns a new object of class 'MA Caddresssetup'.
	 *
	 *
	 * @return a new object of class 'MA Caddresssetup'.
	 * @generated
	 */
	MACaddresssetup createMACaddresssetup();

	/**
	 * Returns a new object of class 'PP Psetup'.
	 *
	 *
	 * @return a new object of class 'PP Psetup'.
	 * @generated
	 */
	PPPsetup createPPPsetup();

	/**
	 * Returns a new object of class 'SMT Psetup'.
	 *
	 *
	 * @return a new object of class 'SMT Psetup'.
	 * @generated
	 */
	SMTPsetup createSMTPsetup();

	/**
	 * Returns a new object of class 'Modemconfiguration'.
	 *
	 *
	 * @return a new object of class 'Modemconfiguration'.
	 * @generated
	 */
	Modemconfiguration createModemconfiguration();

	/**
	 * Returns a new object of class 'Auto answer'.
	 *
	 *
	 * @return a new object of class 'Auto answer'.
	 * @generated
	 */
	Auto_answer createAuto_answer();

	/**
	 * Returns a new object of class 'Auto connect'.
	 *
	 *
	 * @return a new object of class 'Auto connect'.
	 * @generated
	 */
	Auto_connect createAuto_connect();

	/**
	 * Returns a new object of class 'GPRS modem setup'.
	 *
	 *
	 * @return a new object of class 'GPRS modem setup'.
	 * @generated
	 */
	GPRS_modem_setup createGPRS_modem_setup();

	/**
	 * Returns a new object of class 'GSM Diagnostic'.
	 *
	 *
	 * @return a new object of class 'GSM Diagnostic'.
	 * @generated
	 */
	GSM_Diagnostic createGSM_Diagnostic();

	/**
	 * Returns a new object of class 'IEC twisted pair setup'.
	 *
	 *
	 * @return a new object of class 'IEC twisted pair setup'.
	 * @generated
	 */
	IEC_twisted_pair_setup createIEC_twisted_pair_setup();

	/**
	 * Returns a new object of class 'MBus slave port setup'.
	 *
	 *
	 * @return a new object of class 'MBus slave port setup'.
	 * @generated
	 */
	M_Bus_slave_port_setup createM_Bus_slave_port_setup();

	/**
	 * Returns a new object of class 'MBus client'.
	 *
	 *
	 * @return a new object of class 'MBus client'.
	 * @generated
	 */
	M_Bus_client createM_Bus_client();

	/**
	 * Returns a new object of class 'Wireless Mode QChannel'.
	 *
	 *
	 * @return a new object of class 'Wireless Mode QChannel'.
	 * @generated
	 */
	Wireless_Mode_Q_Channel createWireless_Mode_Q_Channel();

	/**
	 * Returns a new object of class 'MBus master port setup'.
	 *
	 *
	 * @return a new object of class 'MBus master port setup'.
	 * @generated
	 */
	M_Bus_master_port_setup createM_Bus_master_port_setup();

	/**
	 * Returns a new object of class 'DLMS COSEM Server MBus port setup'.
	 *
	 *
	 * @return a new object of class 'DLMS COSEM Server MBus port setup'.
	 * @generated
	 */
	DLMS_COSEM_Server_M_Bus_port_setup createDLMS_COSEM_Server_M_Bus_port_setup();

	/**
	 * Returns a new object of class 'MBus diagnostic'.
	 *
	 *
	 * @return a new object of class 'MBus diagnostic'.
	 * @generated
	 */
	M_Bus_diagnostic createM_Bus_diagnostic();

	/**
	 * Returns a new object of class 'Scripttable'.
	 *
	 *
	 * @return a new object of class 'Scripttable'.
	 * @generated
	 */
	Scripttable createScripttable();

	/**
	 * Returns a new object of class 'Script'.
	 *
	 *
	 * @return a new object of class 'Script'.
	 * @generated
	 */
	Script createScript();

	/**
	 * Returns a new object of class 'Schedule'.
	 *
	 *
	 * @return a new object of class 'Schedule'.
	 * @generated
	 */
	Schedule createSchedule();

	/**
	 * Returns a new object of class 'Specialdaystable'.
	 *
	 *
	 * @return a new object of class 'Specialdaystable'.
	 * @generated
	 */
	Specialdaystable createSpecialdaystable();

	/**
	 * Returns a new object of class 'Activitycalendar'.
	 *
	 *
	 * @return a new object of class 'Activitycalendar'.
	 * @generated
	 */
	Activitycalendar createActivitycalendar();

	/**
	 * Returns a new object of class 'Registermonitor'.
	 *
	 *
	 * @return a new object of class 'Registermonitor'.
	 * @generated
	 */
	Registermonitor createRegistermonitor();

	/**
	 * Returns a new object of class 'Singleactionschedule'.
	 *
	 *
	 * @return a new object of class 'Singleactionschedule'.
	 * @generated
	 */
	Singleactionschedule createSingleactionschedule();

	/**
	 * Returns a new object of class 'Parametermonitor'.
	 *
	 *
	 * @return a new object of class 'Parametermonitor'.
	 * @generated
	 */
	Parametermonitor createParametermonitor();

	/**
	 * Returns a new object of class 'Sensormanager'.
	 *
	 *
	 * @return a new object of class 'Sensormanager'.
	 * @generated
	 */
	Sensormanager createSensormanager();

	/**
	 * Returns a new object of class 'Arbitrator'.
	 *
	 *
	 * @return a new object of class 'Arbitrator'.
	 * @generated
	 */
	Arbitrator createArbitrator();

	/**
	 * Returns a new object of class 'Disconnect Control'.
	 *
	 *
	 * @return a new object of class 'Disconnect Control'.
	 * @generated
	 */
	DisconnectControl createDisconnectControl();

	/**
	 * Returns a new object of class 'Limiter'.
	 *
	 *
	 * @return a new object of class 'Limiter'.
	 * @generated
	 */
	Limiter createLimiter();

	/**
	 * Returns a new object of class 'Account'.
	 *
	 *
	 * @return a new object of class 'Account'.
	 * @generated
	 */
	Account createAccount();

	/**
	 * Returns a new object of class 'Credit'.
	 *
	 *
	 * @return a new object of class 'Credit'.
	 * @generated
	 */
	Credit createCredit();

	/**
	 * Returns a new object of class 'Charge'.
	 *
	 *
	 * @return a new object of class 'Charge'.
	 * @generated
	 */
	Charge createCharge();

	/**
	 * Returns a new object of class 'Tokengateway'.
	 *
	 *
	 * @return a new object of class 'Tokengateway'.
	 * @generated
	 */
	Tokengateway createTokengateway();

	/**
	 * Returns a new object of class 'IEC local port setup'.
	 *
	 *
	 * @return a new object of class 'IEC local port setup'.
	 * @generated
	 */
	IEC_local_port_setup createIEC_local_port_setup();

	/**
	 * Returns a new object of class 'IEC HDLC setup'.
	 *
	 *
	 * @return a new object of class 'IEC HDLC setup'.
	 * @generated
	 */
	IEC_HDLC_setup createIEC_HDLC_setup();

	/**
	 * Returns a new object of class 'IEC 8802 2LLC Type 1'.
	 *
	 *
	 * @return a new object of class 'IEC 8802 2LLC Type 1'.
	 * @generated
	 */
	IEC_8802_2_LLC_Type_1 createIEC_8802_2_LLC_Type_1();

	/**
	 * Returns a new object of class 'IEC 8802 2LLC G3 NB'.
	 *
	 *
	 * @return a new object of class 'IEC 8802 2LLC G3 NB'.
	 * @generated
	 */
	IEC_8802_2_LLC_G3_NB createIEC_8802_2_LLC_G3_NB();

	/**
	 * Returns a new object of class 'IEC8802 2LLC Type3'.
	 *
	 *
	 * @return a new object of class 'IEC8802 2LLC Type3'.
	 * @generated
	 */
	IEC8802_2LLCType3 createIEC8802_2LLCType3();

	/**
	 * Returns a new object of class 'Register'.
	 *
	 *
	 * @return a new object of class 'Register'.
	 * @generated
	 */
	Register createRegister();

	/**
	 * Returns a new object of class 'SAP Assignment'.
	 *
	 *
	 * @return a new object of class 'SAP Assignment'.
	 * @generated
	 */
	SAPAssignment createSAPAssignment();

	/**
	 * Returns a new object of class 'Association LN'.
	 *
	 *
	 * @return a new object of class 'Association LN'.
	 * @generated
	 */
	AssociationLN createAssociationLN();

	/**
	 * Returns a new object of class 'Data'.
	 *
	 *
	 * @return a new object of class 'Data'.
	 * @generated
	 */
	Data createData();

	/**
	 * Returns a new object of class 'Extended Register'.
	 *
	 *
	 * @return a new object of class 'Extended Register'.
	 * @generated
	 */
	ExtendedRegister createExtendedRegister();

	/**
	 * Returns a new object of class 'Demand Register'.
	 *
	 *
	 * @return a new object of class 'Demand Register'.
	 * @generated
	 */
	DemandRegister createDemandRegister();

	/**
	 * Returns a new object of class 'Register Activation'.
	 *
	 *
	 * @return a new object of class 'Register Activation'.
	 * @generated
	 */
	RegisterActivation createRegisterActivation();

	/**
	 * Returns a new object of class 'Profilegeneric'.
	 *
	 *
	 * @return a new object of class 'Profilegeneric'.
	 * @generated
	 */
	Profilegeneric createProfilegeneric();

	/**
	 * Returns a new object of class 'Base'.
	 *
	 *
	 * @return a new object of class 'Base'.
	 * @generated
	 */
	Base createBase();

	/**
	 * Returns a new object of class 'Utilitytables'.
	 *
	 *
	 * @return a new object of class 'Utilitytables'.
	 * @generated
	 */
	Utilitytables createUtilitytables();

	/**
	 * Returns a new object of class 'Registertable'.
	 *
	 *
	 * @return a new object of class 'Registertable'.
	 * @generated
	 */
	Registertable createRegistertable();

	/**
	 * Returns a new object of class 'Compactdata'.
	 *
	 *
	 * @return a new object of class 'Compactdata'.
	 * @generated
	 */
	Compactdata createCompactdata();

	/**
	 * Returns a new object of class 'Statusmapping'.
	 *
	 *
	 * @return a new object of class 'Statusmapping'.
	 * @generated
	 */
	Statusmapping createStatusmapping();

	/**
	 * Returns a new object of class 'Association SN'.
	 *
	 *
	 * @return a new object of class 'Association SN'.
	 * @generated
	 */
	AssociationSN createAssociationSN();

	/**
	 * Returns a new object of class 'Imagetransfer'.
	 *
	 *
	 * @return a new object of class 'Imagetransfer'.
	 * @generated
	 */
	Imagetransfer createImagetransfer();

	/**
	 * Returns a new object of class 'Dataprotection'.
	 *
	 *
	 * @return a new object of class 'Dataprotection'.
	 * @generated
	 */
	Dataprotection createDataprotection();

	/**
	 * Returns a new object of class 'Pushsetup'.
	 *
	 *
	 * @return a new object of class 'Pushsetup'.
	 * @generated
	 */
	Pushsetup createPushsetup();

	/**
	 * Returns a new object of class 'Securitysetup'.
	 *
	 *
	 * @return a new object of class 'Securitysetup'.
	 * @generated
	 */
	Securitysetup createSecuritysetup();

	/**
	 * Returns a new object of class 'Clock'.
	 *
	 *
	 * @return a new object of class 'Clock'.
	 * @generated
	 */
	Clock createClock();

	/**
	 * Returns a new object of class 'Application Association'.
	 *
	 *
	 * @return a new object of class 'Application Association'.
	 * @generated
	 */
	ApplicationAssociation createApplicationAssociation();

	/**
	 * Returns the package supported by this factory.
	 *
	 *
	 * @return the package supported by this factory.
	 * @generated
	 */
	InterfaceClassesPackage getInterfaceClassesPackage();

} //InterfaceClassesFactory


text:
import csv
from mpl_toolkits.mplot3d import Axes3D
import numpy
import matplotlib

# Run without the window server.
matplotlib.use('Agg')

import matplotlib.pyplot as plt
import itertools
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter
from math import log
from math import atan as arctan
from sys import stdin
import argparse

parser = argparse.ArgumentParser()
parser.add_argument("name")
args = parser.parse_args()

reader = csv.reader(stdin)
values = itertools.chain(reader)
invocation = values.next()
header = values.next()

x, y, z = [], [], []
for k in values:
    map(lambda a: a[0].append(float(a[1])),zip((x,y,z),k))

for k in zip(x,y,z):
    print k

RYB = plt.get_cmap('RdYlBu')

def colorBy(x):
    return 1-abs(1-x)

def drange(start, stop, step):
    r = start
    while r < stop:
        yield r
        r += step

col = numpy.array(map(RYB,map(colorBy,z)))

fig = plt.figure(figsize=(10,5))
fig.suptitle(invocation,fontsize=14,fontweight='bold')
ax = fig.add_subplot(111, projection='3d')

ax.set_title('<J>=%s' % round(numpy.mean(z),2),position=(0,0),ha='center')

p = ax.scatter(x,y,z,s=12,vmin=-1,vmax=1,c=col, cmap=RYB)
fig.add_axes(ax)
m = cm.ScalarMappable(cmap=RYB)
m.set_array(col)
fig.colorbar(m,boundaries=numpy.arange(0,2,.01),values=numpy.array(map(colorBy,drange(0,2,.01))[:-1]))

ax.set_xlim3d(0,1)
ax.set_ylim3d(0,1)
ax.set_zlim3d(0,5)

ax.set_xlabel(u"\u2202")
ax.set_ylabel(u"\u0395")
ax.set_zlabel('J')

print "Axes:"
print "%s: (%s)" % (header[0],ax.get_xlim3d())
print "%s: (%s)" % (header[1],ax.get_ylim3d())
print "%s: (%s)" % (header[2],ax.get_zlim3d())
#fig.show()
#import time
#time.sleep(10)

fig.savefig(args.name)


text:
package com.simplifiedlogic.nitro.jlink.calls.family;

import com.ptc.cipjava.jxthrowable;
import com.ptc.pfc.pfcFamily.FamilyTableColumn;
import com.ptc.pfc.pfcFamily.FamilyTableColumns;
import com.simplifiedlogic.nitro.jlink.intf.DebugLogging;
import com.simplifiedlogic.nitro.jlink.impl.NitroConstants;

/**
 * Wrapper for JLink's com.ptc.pfc.pfcFamily.FamilyTableColumns
 *
 * @author Adam Andrews
 *
 */
public class CallFamilyTableColumns {

	private FamilyTableColumns cols;

	public CallFamilyTableColumns(FamilyTableColumns cols) {
		this.cols = cols;
	}

	public static CallFamilyTableColumns create() throws jxthrowable {
        if (NitroConstants.DEBUG_JLINK) DebugLogging.sendTimerMessage("FamilyTableColumns,create", 0, NitroConstants.DEBUG_JLINK_KEY);
        FamilyTableColumns cols = FamilyTableColumns.create();
		if (cols==null)
			return null;
		return new CallFamilyTableColumns(cols);
	}

	public void append(CallFamilyTableColumn col) throws jxthrowable {
        if (NitroConstants.DEBUG_JLINK) DebugLogging.sendTimerMessage("FamilyTableColumns,append", 0, NitroConstants.DEBUG_JLINK_KEY);
        cols.append(col.getCol());
	}

	public int getarraysize() throws jxthrowable {
        if (NitroConstants.DEBUG_JLINK) DebugLogging.sendTimerMessage("FamilyTableColumns,getarraysize", 0, NitroConstants.DEBUG_JLINK_KEY);
		return cols.getarraysize();
	}

	public CallFamilyTableColumn get(int idx) throws jxthrowable {
        if (NitroConstants.DEBUG_JLINK) DebugLogging.sendTimerMessage("FamilyTableColumns,get(" + idx + ")", 0, NitroConstants.DEBUG_JLINK_KEY);
        FamilyTableColumn col = cols.get(idx);
		if (col==null)
			return null;
		return new CallFamilyTableColumn(col);
	}

	public FamilyTableColumns getFamilyTableColumns() {
		return cols;
	}
}


text:
import NullLogger from '../logger.js';
import ThriftUtils from '../thrift.js';
import Metrics from '../metrics/metrics.js';
import NoopMetricFactory from '../metrics/noop/metric_factory';

const DEFAULT_BUFFER_FLUSH_INTERVAL_MILLIS = 1000;

export default class RemoteReporter implements Reporter {
  _bufferFlushInterval: number;
  _logger: Logger;
  _sender: Sender;
  _intervalHandle: any;
  _process: Process;
  _metrics: any;

  constructor(sender: Sender, options: any = {}) {
    if (!sender) {
      throw new Error('RemoteReporter must be given a Sender.');
    }

    this._bufferFlushInterval = options.bufferFlushInterval || DEFAULT_BUFFER_FLUSH_INTERVAL_MILLIS;
    this._logger = options.logger || new NullLogger();
    this._sender = sender;
    this._intervalHandle = setInterval(() => {
      this.flush();
    }, this._bufferFlushInterval);
    this._metrics = options.metrics || new Metrics(new NoopMetricFactory());
  }

  name(): string {
    return 'RemoteReporter';
  }

  toString(): string {
    return this.name();
  }

  report(span: Span): void {
    const thriftSpan = ThriftUtils.spanToThrift(span);
    this._sender.append(thriftSpan, this._appendCallback);
  }

  _appendCallback = (numSpans: number, err?: string) => {
    if (err) {
      this._logger.error(`Failed to append spans in reporter: ${err}`);
      this._metrics.reporterDropped.increment(numSpans);
    } else {
      this._metrics.reporterSuccess.increment(numSpans);
    }
  };

  _invokeCallback(callback?: () => void): void {
    if (callback) {
      callback();
    }
  }

  flush(callback?: () => void): void {
    if (this._process === undefined) {
      this._logger.error('Failed to flush since process is not set.');
      this._invokeCallback(callback);
      return;
    }
    this._sender.flush((numSpans: number, err?: string) => {
      if (err) {
        this._logger.error(`Failed to flush spans in reporter: ${err}`);
        this._metrics.reporterFailure.increment(numSpans);
      } else {
        this._metrics.reporterSuccess.increment(numSpans);
      }
      this._invokeCallback(callback);
    });
  }

  close(callback?: () => void): void {
    clearInterval(this._intervalHandle);
    this.flush(() => {
      this._sender.close();
      this._invokeCallback(callback);
    });
  }

  setProcess(serviceName: string, tags: Array<Tag>): void {
    this._process = {
      serviceName: serviceName,
      tags: ThriftUtils.getThriftTags(tags),
    };

    this._sender.setProcess(this._process);
  }
}