If your bandmates are already on JamKazam, start typing their names in the box below, or click the Choose Friends button to select them.")
invitationDialog = invitationDialogInstance
events()
@@ -676,7 +719,7 @@
app.bindScreen('band/setup', screenBindings)
- $('input[type=radio]').iCheck({
+ $screen.find('input[type=radio]').iCheck({
checkboxClass: 'icheckbox_minimal',
radioClass: 'iradio_minimal',
inheritClass: true
diff --git a/web/app/assets/javascripts/checkout_order.js b/web/app/assets/javascripts/checkout_order.js
index 70f5171a0..168b965d6 100644
--- a/web/app/assets/javascripts/checkout_order.js
+++ b/web/app/assets/javascripts/checkout_order.js
@@ -185,7 +185,7 @@
displayTax(effectiveQuantity, unitTax, 1.99 + unitTax)
}
else {
-
+ checkoutUtils.configureRecurly()
var pricing = context.recurly.Pricing();
pricing.plan_code = gon.recurly_tax_estimate_jam_track_plan;
pricing.resolved = false;
diff --git a/web/app/assets/javascripts/checkout_utils.js.coffee b/web/app/assets/javascripts/checkout_utils.js.coffee
index 7f61f0fb8..4570bd052 100644
--- a/web/app/assets/javascripts/checkout_utils.js.coffee
+++ b/web/app/assets/javascripts/checkout_utils.js.coffee
@@ -8,6 +8,7 @@ class CheckoutUtils
@rest = new context.JK.Rest();
@cookie_name = "preserve_billing"
@lastPurchaseResponse = null
+ @configuredRecurly = false
init: () =>
@@ -54,5 +55,10 @@ class CheckoutUtils
return carts[0].product_info.free
+ configureRecurly: () =>
+ unless @configuredRecurly
+ context.recurly.configure(gon.global.recurly_public_api_key)
+ @configuredRecurly = true
+
# global instance
context.JK.CheckoutUtilsInstance = new CheckoutUtils()
\ No newline at end of file
diff --git a/web/app/assets/javascripts/corp/corporate.js b/web/app/assets/javascripts/corp/corporate.js
index 989e7bb85..5d6e33bfa 100644
--- a/web/app/assets/javascripts/corp/corporate.js
+++ b/web/app/assets/javascripts/corp/corporate.js
@@ -1,3 +1,4 @@
+//= require bugsnag
//= require jquery
//= require jquery.queryparams
//= require AAA_Log
diff --git a/web/app/assets/javascripts/dialog/banner.js b/web/app/assets/javascripts/dialog/banner.js
index 7e0fc0f12..2c777c0f0 100644
--- a/web/app/assets/javascripts/dialog/banner.js
+++ b/web/app/assets/javascripts/dialog/banner.js
@@ -133,20 +133,25 @@
if(options.buttons) {
context._.each(options.buttons, function(button, i) {
if(!button.name) throw "button.name must be specified";
- if(!button.click) throw "button.click must be specified";
+ if(!button.click && !button.href) throw "button.click or button.href must be specified";
var buttonStyle = button.buttonStyle;
if(!buttonStyle) {
buttonStyle = options.buttons.length == i + 1 ? 'button-orange' : 'button-grey';
}
-
var $btn = $('' + button.name + '');
- $btn.click(function() {
- button.click();
- hide();
- return false;
- });
+
+ if(button.href) {
+ $btn.attr('href', button.href)
+ }
+ else {
+ $btn.click(function() {
+ button.click();
+ hide();
+ return false;
+ });
+ }
$buttons.append($btn);
});
}
diff --git a/web/app/assets/javascripts/everywhere/everywhere.js b/web/app/assets/javascripts/everywhere/everywhere.js
index 1b27ba754..43a844a32 100644
--- a/web/app/assets/javascripts/everywhere/everywhere.js
+++ b/web/app/assets/javascripts/everywhere/everywhere.js
@@ -20,6 +20,11 @@
var stun = null;
var rest = context.JK.Rest();
+ if(gon.global.web_performance_timing_enabled) {
+ $(window).on('load', sendTimingResults)
+ $(window).on('pagehide', setNavigationStart)
+ }
+
$(document).on('JAMKAZAM_CONSTRUCTED', function(e, data) {
@@ -245,4 +250,63 @@
}
}
+ function setNavigationStart() {
+ if(!window.performance || !window.performance.timing) {
+ try {
+ window.sessionStorage.setItem('navigationStart', Date.now())
+ }
+ catch(e) {
+ logger.debug("unable to accesss sessionStorage")
+ }
+ }
+
+ }
+
+
+ // http://githubengineering.com/browser-monitoring-for-github-com/
+ function sendTimingResults() {
+
+ setTimeout(function() {
+ var timing;
+ var hasTimingApi;
+
+ if(window.performance && window.performance.timing) {
+ timing = window.performance.timing
+ hasTimingApi = true;
+ }
+ else {
+ timing = {}
+ hasTimingApi = false;
+ }
+
+ // Merge in simulated cross-browser load event
+ timing['crossBrowserLoadEvent'] = Date.now()
+
+ var chromeFirstPaintTime;
+ if(window.chrome && window.chrome.loadTimes) {
+ var loadTimes = window.chrome.loadTimes()
+ if(loadTimes) {
+ chromeFirstPaintTime = true;
+ }
+ }
+
+ // firstPaintTime is in seconds; convert to milliseconds to match performance.timing.
+ timing['chromeFirstPaintTime'] = Math.round(chromeFirstPaintTime * 1000);
+
+ // Merge in simulated navigation start, if no navigation timing
+ if (!hasTimingApi) {
+ try {
+ var navStart = window.sessionStorage.getItem('navigationStart')
+ if(navStart) {
+ timing['navigationStart'] = parseInt(navStart, 10)
+ }
+ }
+ catch(e) { }
+ }
+
+ context.JK.GA.trackTiming(timing);
+ }, 0)
+
+ }
+
})(window, jQuery);
diff --git a/web/app/assets/javascripts/ga.js b/web/app/assets/javascripts/ga.js
index 8e51a081e..b26cf777a 100644
--- a/web/app/assets/javascripts/ga.js
+++ b/web/app/assets/javascripts/ga.js
@@ -284,6 +284,37 @@
logger.debug("Tracked Jam Track Play")
}
+ function trackTiming(timing) {
+
+ if(!timing) {return}
+
+ try {
+ var computed = {
+ dns: timing.domainLookupEnd - timing.domainLookupStart,
+ connect: timing.connectEnd - timing.connectStart,
+ ttfb: timing.responseStart - timing.connectEnd,
+ basePage: timing.responseEnd - timing.responseStart,
+ frontEnd: timing.loadEventStart - timing.responseEnd,
+ domContentLoadedEvent: timing.domContentLoadedEventEnd - timing.domContentLoadedEventStart,
+ windowLoadEvent: timing.loadEventEnd - timing.loadEventStart,
+ domInteractive: timing.domInteractive - timing.domLoading,
+ domComplete: timing.domComplete - timing.domLoading,
+ domCompleteToOnload: timing.loadEventStart - timing.domComplete
+ };
+
+ logger.debug("page load time: " + computed.frontEnd)
+ context._.each(computed, function (value, key) {
+ if (value > 0 && value < 60000) {
+ context.ga("send", "timing", "NavigationTiming", key, value, null, {'page' : '/' + window.location.pathname});
+ }
+ })
+ //context.stats.write('web.timing.navigation', computed)
+ }
+ catch(e) {
+ logger.error("loading times failed in ga.js", e)
+ }
+ }
+
// if you want to pass in no title, either omit it from the arg list when u invoke virtualPageView, or pass in undefined, NOT null
function virtualPageView(page, title) {
@@ -445,6 +476,7 @@
GA.trackBand = trackBand;
GA.trackJKSocial = trackJKSocial;
GA.virtualPageView = virtualPageView;
+ GA.trackTiming = trackTiming;
context.JK.GA = GA;
diff --git a/web/app/assets/javascripts/globals.js b/web/app/assets/javascripts/globals.js
index 175a96fd6..85ebcc250 100644
--- a/web/app/assets/javascripts/globals.js
+++ b/web/app/assets/javascripts/globals.js
@@ -52,7 +52,8 @@
JAMTRACK_DOWNLOADER_STATE_CHANGED: 'jamtrack_downloader_state',
METRONOME_PLAYBACK_MODE_SELECTED: 'metronome_playback_mode_selected',
CHECKOUT_SIGNED_IN: 'checkout_signed_in',
- CHECKOUT_SKIP_SIGN_IN: 'checkout_skip_sign_in'
+ CHECKOUT_SKIP_SIGN_IN: 'checkout_skip_sign_in',
+ PREVIEW_PLAYED: 'preview_played'
};
context.JK.PLAYBACK_MONITOR_MODE = {
diff --git a/web/app/assets/javascripts/helpBubbleHelper.js b/web/app/assets/javascripts/helpBubbleHelper.js
index eb68a4a6c..c8ccdc4cf 100644
--- a/web/app/assets/javascripts/helpBubbleHelper.js
+++ b/web/app/assets/javascripts/helpBubbleHelper.js
@@ -62,6 +62,24 @@
}
}
+ helpBubble.rotateJamTrackLandingBubbles = function($preview, $video, $ctaButton, $alternativeCta) {
+ $(window).on('load', function() {
+ setTimeout(function() {
+ helpBubble.jamtrackLandingPreview($preview, $preview.offsetParent())
+
+ setTimeout(function() {
+ helpBubble.jamtrackLandingVideo($video, $video.offsetParent())
+
+ setTimeout(function() {
+ helpBubble.jamtrackLandingCta($ctaButton, $alternativeCta)
+ }, 11000); // 5 seconds on top of 6 second show time of bubbles
+ }, 11000); // 5 seconds on top of 6 second show time of bubbles
+ }, 1500)
+
+
+ })
+ }
+
helpBubble.clearJamTrackGuide = clearJamTrackGuideTimeout;
helpBubble.jamtrackGuideTile = function ($element, $offsetParent) {
@@ -82,4 +100,33 @@
})
}
+ helpBubble.jamtrackLandingPreview = function($element, $offsetParent) {
+ context.JK.prodBubble($element, 'jamtrack-landing-preview', {}, bigHelpOptions({positions:['right'], offsetParent: $offsetParent}))
+ }
+
+ helpBubble.jamtrackLandingVideo = function($element, $offsetParent) {
+ context.JK.prodBubble($element, 'jamtrack-landing-video', {}, bigHelpOptions({positions:['left'], offsetParent: $offsetParent}))
+ }
+
+ helpBubble.jamtrackLandingCta = function($element, $alternativeElement) {
+ if ($element.visible()) {
+ context.JK.prodBubble($element, 'jamtrack-landing-cta', {}, bigHelpOptions({positions:['left']}))
+ }
+ else {
+ context.JK.prodBubble($alternativeElement, 'jamtrack-landing-cta', {}, bigHelpOptions({positions:['right']}))
+ }
+ }
+
+ helpBubble.jamtrackBrowseBand = function($element, $offsetParent) {
+ return context.JK.prodBubble($element, 'jamtrack-browse-band', {}, bigHelpOptions({positions:['top'], offsetParent: $offsetParent}))
+ }
+
+ helpBubble.jamtrackBrowseMasterMix = function($element, $offsetParent) {
+ return context.JK.prodBubble($element, 'jamtrack-browse-master-mix', {}, bigHelpOptions({positions:['top'], offsetParent: $offsetParent}))
+ }
+
+ helpBubble.jamtrackBrowseCta = function($element, $offsetParent) {
+ return context.JK.prodBubble($element, 'jamtrack-browse-cta', {}, bigHelpOptions({positions:['top'], offsetParent: $offsetParent}))
+ }
+
})(window, jQuery);
\ No newline at end of file
diff --git a/web/app/assets/javascripts/jam_rest.js b/web/app/assets/javascripts/jam_rest.js
index 3671e58d1..6adbca0cc 100644
--- a/web/app/assets/javascripts/jam_rest.js
+++ b/web/app/assets/javascripts/jam_rest.js
@@ -499,6 +499,80 @@
return profile;
}
+ function createAffiliatePartner(options) {
+ return $.ajax({
+ type: "POST",
+ url: '/api/affiliate_partners',
+ dataType: "json",
+ contentType: 'application/json',
+ data: JSON.stringify(options)
+ })
+ }
+
+ function getAffiliatePartnerData(userId) {
+ return $.ajax({
+ type: "GET",
+ dataType: "json",
+ url: "/api/users/"+userId+"/affiliate_partner"
+ });
+ }
+
+ function postAffiliatePartnerData(userId, data) {
+ return $.ajax({
+ type: "POST",
+ dataType: "json",
+ url: "/api/users/"+userId+"/affiliate_partner",
+ contentType: 'application/json',
+ processData:false,
+ data: JSON.stringify(data)
+ });
+ }
+
+ function getLinks(type, partner_id) {
+ var url = "/api/links/" + type;
+
+ if(partner_id) {
+ url += '?affiliate_id=' + partner_id;
+ }
+ return $.ajax({
+ type: "GET",
+ dataType: "json",
+ url: url
+ });
+ }
+
+ function getAffiliateSignups() {
+ return $.ajax({
+ type: "GET",
+ dataType: "json",
+ url: "/api/affiliate_partners/signups"
+ });
+ }
+
+ function getAffiliateMonthly() {
+ return $.ajax({
+ type: "GET",
+ dataType: "json",
+ url: "/api/affiliate_partners/monthly_earnings"
+ });
+ }
+
+ function getAffiliateQuarterly() {
+ return $.ajax({
+ type: "GET",
+ dataType: "json",
+ url: "/api/affiliate_partners/quarterly_earnings"
+ });
+ }
+
+ function getAffiliatePayments() {
+ return $.ajax({
+ type: "GET",
+ dataType: "json",
+ url: "/api/affiliate_partners/payments"
+ });
+ }
+
function getCities(options) {
var country = options['country']
var region = options['region']
@@ -1492,12 +1566,13 @@
function enqueueJamTrack(options) {
var jamTrackId = options['id'];
+ delete options['id']
return $.ajax({
type: "POST",
- url: '/api/jamtracks/enqueue/' + jamTrackId + '?' + $.param(options),
+ url: '/api/jamtracks/enqueue/' + jamTrackId,
dataType: "json",
- contentType: 'applications/json'
+ data: options
});
}
@@ -1751,6 +1826,14 @@
this.updateScheduledSession = updateScheduledSession;
this.getUserDetail = getUserDetail;
this.getUserProfile = getUserProfile;
+ this.getAffiliatePartnerData = getAffiliatePartnerData;
+ this.postAffiliatePartnerData = postAffiliatePartnerData;
+ this.createAffiliatePartner = createAffiliatePartner;
+ this.getLinks = getLinks;
+ this.getAffiliateSignups = getAffiliateSignups;
+ this.getAffiliateMonthly = getAffiliateMonthly;
+ this.getAffiliateQuarterly = getAffiliateQuarterly;
+ this.getAffiliatePayments = getAffiliatePayments;
this.getCities = getCities;
this.getRegions = getRegions;
this.getCountries = getCountries;
diff --git a/web/app/assets/javascripts/jam_track_preview.js.coffee b/web/app/assets/javascripts/jam_track_preview.js.coffee
index a02a45896..f78a25d05 100644
--- a/web/app/assets/javascripts/jam_track_preview.js.coffee
+++ b/web/app/assets/javascripts/jam_track_preview.js.coffee
@@ -9,7 +9,7 @@ context.JK.JamTrackPreview = class JamTrackPreview
@EVENTS = context.JK.EVENTS
@rest = context.JK.Rest()
@logger = context.JK.logger
- @options = options || {master_shows_duration: false, color:'gray', add_line_break: false}
+ @options = options || {master_shows_duration: false, color:'gray', add_line_break: false, preload_master:false}
@app = app
@jamTrack = jamTrack
@jamTrackTrack = jamTrackTrack
@@ -19,7 +19,9 @@ context.JK.JamTrackPreview = class JamTrackPreview
@instrumentIcon = null
@instrumentName = null
@part = null
+ @loaded = false
@loading = null
+ @loadingText = null
template = $('#template-jam-track-preview')
throw "no jam track preview template" if not template.exists()
@@ -31,6 +33,7 @@ context.JK.JamTrackPreview = class JamTrackPreview
@instrumentName = @root.find('.instrument-name')
@part = @root.find('.part')
@loading = @root.find('.loading')
+ @loadingText = @root.find('.loading-text')
@playButton.on('click', @play)
@stopButton.on('click', @stop)
@@ -91,6 +94,16 @@ context.JK.JamTrackPreview = class JamTrackPreview
if @no_audio
@playButton.addClass('disabled')
@stopButton.addClass('disabled')
+ else
+ if @options.preload_master && @jamTrackTrack.track_type == 'Master'
+ @sound = new Howl({
+ src: @urls,
+ autoplay: false,
+ loop: false,
+ volume: 1.0,
+ preload: true,
+ onload: @onHowlerLoad
+ onend: @onHowlerEnd})
onDestroyed: () =>
@sound.unload()
@@ -108,12 +121,16 @@ context.JK.JamTrackPreview = class JamTrackPreview
@removeNowPlaying()
onHowlerLoad: () =>
- @loading.addClass('hidden')
+ @loaded = true
+ @loading.fadeOut();
+ @loadingText.fadeOut(); #addClass('hidden')
play: (e) =>
if e?
e.stopPropagation()
+ $(this).triggerHandler(@EVENTS.PREVIEW_PLAYED)
+
if @no_audio
context.JK.prodBubble(@playButton, 'There is no preview available for this track.', {}, {duration:2000})
else
@@ -129,7 +146,9 @@ context.JK.JamTrackPreview = class JamTrackPreview
onload: @onHowlerLoad
onend: @onHowlerEnd})
+ unless @loaded
@loading.removeClass('hidden')
+ @loadingText.removeClass('hidden')
@logger.debug("play issued for jam track preview")
diff --git a/web/app/assets/javascripts/jam_track_screen.js.coffee b/web/app/assets/javascripts/jam_track_screen.js.coffee
index 43411b93b..ac25cc4c8 100644
--- a/web/app/assets/javascripts/jam_track_screen.js.coffee
+++ b/web/app/assets/javascripts/jam_track_screen.js.coffee
@@ -6,7 +6,8 @@ context.JK.JamTrackScreen=class JamTrackScreen
LIMIT = 10
instrument_logo_map = context.JK.getInstrumentIconMap24()
- constructor: (@app) ->
+ constructor: (@app) ->
+ @EVENTS = context.JK.EVENTS
@logger = context.JK.logger
@screen = null
@content = null
@@ -21,6 +22,7 @@ context.JK.JamTrackScreen=class JamTrackScreen
@next = null
@currentQuery = this.defaultQuery()
@expanded = null
+ @shownHelperBubbles = false
beforeShow:(data) =>
this.setFilterFromURL()
@@ -38,11 +40,17 @@ context.JK.JamTrackScreen=class JamTrackScreen
)
else
this.refresh()
+ unless @shownHelperBubbles
+ @shownHelperBubbles = true
+ @startHelperBubbles()
afterShow:(data) =>
context.JK.Tracking.jamtrackBrowseTrack(@app)
beforeHide: () =>
+ this.clearCtaHelpTimeout()
+ this.clearBandFilterHelpTimeout()
+ this.clearMasterHelpTimeout()
this.clearResults();
events:() =>
@@ -57,6 +65,104 @@ context.JK.JamTrackScreen=class JamTrackScreen
@noMoreJamtracks.hide()
@next = null
+ startHelperBubbles: () =>
+ @showBandFilterHelpTimeout = setTimeout(@showBandFilterHelp, 3500)
+
+ showBandFilterHelp: () =>
+ context.JK.HelpBubbleHelper.jamtrackBrowseBand(@artist.closest('.easydropdown-wrapper'), $('body'))
+
+ @showMasterHelpDueTime = new Date().getTime() + 11000 # 6000 ms for band tooltip to display, and 5 seconds of quiet time
+ @scroller.on('scroll', @masterHelpScrollWatch)
+ @scroller.on('scroll', @clearBubbles)
+ @showMasterHelpTimeout = setTimeout(@showMasterHelp, @masterHelpDueTime())
+
+ clearBubbles: () =>
+ if @helpBubble?
+ @helpBubble.btOff()
+ @helpBubble = null
+
+ # computes when we should show the master help bubble
+ masterHelpDueTime: () =>
+ dueTime = @showMasterHelpDueTime - new Date().getTime()
+ if dueTime <= 0
+ dueTime = 2000
+ dueTime
+
+
+ # computes when we should show the master help bubble
+ ctaHelpDueTime: () =>
+ dueTime = @showCtaHelpDueTime - new Date().getTime()
+ if dueTime <= 0
+ dueTime = 2000
+ dueTime
+
+ # if the user scrolls, reset the master help due time
+ masterHelpScrollWatch: () =>
+ @clearMasterHelpTimeout()
+ @showMasterHelpTimeout = setTimeout(@showMasterHelp, @masterHelpDueTime() + 2000)
+
+ # if the user scrolls, reset the master help due time
+ ctaHelpScrollWatch: () =>
+ @clearCtaHelpTimeout()
+ @showCtaHelpTimeout = setTimeout(@showCtaHelp, @ctaHelpDueTime() + 2000)
+
+
+ showCtaHelp: () =>
+ @scroller.off('scroll', @ctaHelpScrollWatch)
+ @clearCtaHelpTimeout()
+
+ cutoff = @scroller.offset().top;
+
+ @screen.find('.jamtrack-actions').each((i, element) =>
+ $element = $(element)
+
+ if ($element.offset().top >= cutoff)
+ @helpBubble = context.JK.HelpBubbleHelper.jamtrackBrowseCta($element, $('body'))
+ return false
+ else
+ return true
+ )
+
+ showMasterHelp: () =>
+ @scroller.off('scroll', @masterHelpScrollWatch)
+ @clearMasterHelpTimeout()
+
+ # don't show the help if the user has already clicked a preview
+ unless @userPreviewed
+ cutoff = @scroller.offset().top;
+
+ @screen.find('.jamtrack-preview[data-track-type="Master"]').each((i, element) =>
+ $element = $(element)
+
+ if ($element.offset().top >= cutoff)
+ @helpBubble = context.JK.HelpBubbleHelper.jamtrackBrowseMasterMix($element.find('.play-button'), $('body'))
+ return false
+ else
+ return true
+ )
+
+ @showCtaHelpDueTime = new Date().getTime() + 11000
+ @scroller.on('scroll', @ctaHelpScrollWatch)
+ @showCtaHelpTimeout = setTimeout(@showCtaHelp, @ctaHelpDueTime()) # 6000 ms for bubble show time, and 5000ms for delay
+
+ previewPlayed: () =>
+ @userPreviewed = true
+
+ clearCtaHelpTimeout:() =>
+ if @showCtaHelpTimeout?
+ clearTimeout(@showCtaHelpTimeout)
+ @showCtaHelpTimeout = null
+
+ clearBandFilterHelpTimeout: () =>
+ if @showBandFilterHelpTimeout?
+ clearTimeout(@showBandFilterHelpTimeout)
+ @showBandFilterHelpTimeout = null
+
+ clearMasterHelpTimeout: () =>
+ if @showMasterHelpTimeout?
+ clearTimeout(@showMasterHelpTimeout)
+ @showMasterHelpTimeout = null
+
setFilterFromURL:() =>
# Grab parms from URL for artist, instrument, and availability
parms=this.getParams()
@@ -73,7 +179,9 @@ context.JK.JamTrackScreen=class JamTrackScreen
@availability.val(parms.availability)
else
@availability.val('')
- window.history.replaceState({}, "", "/client#/jamtrackBrowse")
+
+ if window.history.replaceState #ie9 proofing
+ window.history.replaceState({}, "", "/client#/jamtrackBrowse")
getParams:() =>
params = {}
@@ -320,7 +428,8 @@ context.JK.JamTrackScreen=class JamTrackScreen
for track in jamTrack.tracks
trackRow = jamtrackElement.find("[jamtrack-track-id='#{track.id}']")
previewElement = trackRow.find(".jamtrack-preview")
- new JK.JamTrackPreview(@app, previewElement, jamTrack, track, {master_shows_duration: true, color:'gray'})
+ preview = new JK.JamTrackPreview(@app, previewElement, jamTrack, track, {master_shows_duration: true, color:'gray'})
+ $(preview).on(@EVENTS.PREVIEW_PLAYED, @previewPlayed)
this.handleExpanded(jamtrackElement, false)
diff --git a/web/app/assets/javascripts/jamtrack_landing.js.coffee b/web/app/assets/javascripts/jamtrack_landing.js.coffee
index 2fb470923..5198a1f64 100644
--- a/web/app/assets/javascripts/jamtrack_landing.js.coffee
+++ b/web/app/assets/javascripts/jamtrack_landing.js.coffee
@@ -72,7 +72,8 @@ context.JK.JamTrackLanding = class JamTrackLanding
that=this
@bandList.on "click", "a.artist-link", (event)->
context.location="client#/jamtrackBrowse"
- window.history.replaceState({}, "", this.href)
+ if window.history.replaceState # ie9 proofing
+ window.history.replaceState({}, "", this.href)
event.preventDefault()
handleFailure:(error) =>
diff --git a/web/app/assets/javascripts/landing/landing.js b/web/app/assets/javascripts/landing/landing.js
index 19034e53c..de23401db 100644
--- a/web/app/assets/javascripts/landing/landing.js
+++ b/web/app/assets/javascripts/landing/landing.js
@@ -1,3 +1,4 @@
+//= require bugsnag
//= require bind-polyfill
//= require jquery
//= require jquery.monkeypatch
diff --git a/web/app/assets/javascripts/landing/signup.js b/web/app/assets/javascripts/landing/signup.js
index a91329222..0eec67cf4 100644
--- a/web/app/assets/javascripts/landing/signup.js
+++ b/web/app/assets/javascripts/landing/signup.js
@@ -156,6 +156,9 @@
submit_data.city = $('#jam_ruby_user_city').val()
submit_data.birth_date = gather_birth_date()
submit_data.instruments = gather_instruments()
+ if($.QueryString['affiliate_partner_id']) {
+ submit_data.affiliate_partner_id = $.QueryString['affiliate_partner_id'];
+ }
//submit_data.photo_url = $('#jam_ruby_user_instruments').val()
diff --git a/web/app/assets/javascripts/site_validator.js.coffee b/web/app/assets/javascripts/site_validator.js.coffee
index 0ce2c645a..41636af26 100644
--- a/web/app/assets/javascripts/site_validator.js.coffee
+++ b/web/app/assets/javascripts/site_validator.js.coffee
@@ -4,12 +4,13 @@ context.JK ||= {};
context.JK.SiteValidator = class SiteValidator
- constructor: (site_type, success_callback, fail_callback) ->
+ constructor: (site_type, success_callback, fail_callback, parent) ->
@EVENTS = context.JK.EVENTS
@rest = context.JK.Rest()
@site_type = site_type
- @input_div = $(".site_validator#"+site_type+"_validator")
- @data_input = @input_div.find('input')
+ @input_div = $(".site_validator."+site_type+"_validator", parent)
+ @data_input = @input_div.find('input')
+
@logger = context.JK.logger
@spinner = @input_div.find('span.spinner-small')
@checkmark = @input_div.find('.validate-checkmark')
@@ -33,7 +34,7 @@ context.JK.SiteValidator = class SiteValidator
@site_status = null
dataToValidate: () =>
- url = @data_input.val()
+ url = @data_input.val()
if url && 0 < url.length
url.substring(0,2000)
else
@@ -129,8 +130,8 @@ context.JK.SiteValidator = class SiteValidator
context.JK.RecordingSourceValidator = class RecordingSourceValidator extends SiteValidator
- constructor: (site_type, success_callback, fail_callback) ->
- super(site_type)
+ constructor: (site_type, success_callback, fail_callback, parent) ->
+ super(site_type, success_callback, fail_callback, parent)
@recording_sources = []
@is_rec_src = true
@add_btn = @input_div.find('a.add-recording-source')
diff --git a/web/app/assets/javascripts/utils.js b/web/app/assets/javascripts/utils.js
index db0826c0f..8af882715 100644
--- a/web/app/assets/javascripts/utils.js
+++ b/web/app/assets/javascripts/utils.js
@@ -630,6 +630,10 @@
return (suppressDay ? '' : (days[date.getDay()] + ' ')) + months[date.getMonth()] + ' ' + context.JK.padString(date.getDate(), 2) + ', ' + date.getFullYear();
}
+ // returns June for months 0-11
+ context.JK.getMonth = function(monthNumber) {
+ return months[monthNumber];
+ }
context.JK.formatDateYYYYMMDD = function(dateString) {
var date = new Date(dateString);
diff --git a/web/app/assets/javascripts/web/affiliate_links.js.coffee b/web/app/assets/javascripts/web/affiliate_links.js.coffee
new file mode 100644
index 000000000..be15b3e5a
--- /dev/null
+++ b/web/app/assets/javascripts/web/affiliate_links.js.coffee
@@ -0,0 +1,55 @@
+
+
+$ = jQuery
+context = window
+context.JK ||= {};
+
+class AffiliateLinks
+ constructor: (@app, @partner_id) ->
+ @logger = context.JK.logger
+ @rest = new context.JK.Rest();
+
+ initialize: () =>
+ @page = $('body')
+ @sections = ['jamtrack_songs', 'jamtrack_bands', 'jamtrack_general', 'jamkazam', 'sessions', 'recordings']
+ @jamtrack_songs = @page.find('table.jamtrack_songs tbody')
+ @jamtrack_bands = @page.find('table.jamtrack_bands tbody')
+ @jamtrack_general = @page.find('table.jamtrack_general tbody')
+ @jamkazam = @page.find('table.jamkazam tbody')
+ @sessions= @page.find('table.sessions tbody')
+ @recordings = @page.find('table.recordings tbody')
+
+ @iterate()
+
+ onGetLinks: (links) =>
+
+ $table = @page.find('table.' + @section + ' tbody')
+ template = $('#template-affiliate-link-row').html();
+ context._.each(links, (item) =>
+ $link = $(context._.template(template, item, {variable: 'data'}));
+ $link.find('td.copy-link a').click(@copyLink)
+ $table.append($link)
+ )
+
+ if @sections.length > 0
+ @iterate()
+
+
+ copyLink: () ->
+ $element = $(this)
+ $url = $element.closest('tr').find('td.url input')
+ $url.select()
+
+ return false;
+
+
+ iterate: () =>
+ @section = @sections.shift()
+
+ @rest.getLinks(@section, @partner_id)
+ .done(@onGetLinks)
+
+
+
+context.JK.AffiliateLinks = AffiliateLinks
+
diff --git a/web/app/assets/javascripts/web/affiliate_program.js.coffee b/web/app/assets/javascripts/web/affiliate_program.js.coffee
new file mode 100644
index 000000000..c013abbf2
--- /dev/null
+++ b/web/app/assets/javascripts/web/affiliate_program.js.coffee
@@ -0,0 +1,119 @@
+
+
+$ = jQuery
+context = window
+context.JK ||= {};
+
+class AffiliateProgram
+ constructor: (@app) ->
+ @logger = context.JK.logger
+ @rest = new context.JK.Rest();
+ @agreeBtn = null
+ @disagreeBtn = null
+ @entityForm = null
+ @disagreeNotice = null
+ @entityName = null
+ @entityType = null
+ @entityRadio = null
+ @fieldEntityName = null
+ @fieldEntityType = null
+ @entityOptions = null
+
+ removeErrors: () =>
+ @fieldEntityName.removeClass('error').find('.error-info').remove();
+ @fieldEntityType.removeClass('error').find('.error-info').remove();
+ @entityOptions.removeClass('error').find('.error-info').remove();
+
+ onRadioChanged: () =>
+ @removeErrors()
+ value = @page.find('input:radio[name="entity"]:checked').val()
+
+ if value == 'individual'
+ @entityForm.slideUp()
+ else
+ @entityForm.slideDown()
+
+ return false
+
+
+ onCreatedAffiliatePartner:(response) =>
+ if response.partner_user_id?
+ # this was an existing user, so tell them to go on in
+ context.JK.Banner.show({buttons: [{name: 'GO TO AFFILIATE PAGE', href: '/client#/account/affiliatePartner'}], title: 'congratulations', html: 'Thank you for joining the JamKazam affiliate program!
You can visit the Affiliate Page in your JamKazam Account any time to get links to share to refer users, and to view reports on affiliate activity levels.'})
+ else
+ context.JK.Banner.show({buttons: [{name: 'GO SIGNUP', href:'/signup?affiliate_partner_id=' + response.id}], title: 'congratulations', html: 'Thank you for joining the JamKazam affiliate program!
There is still one more step: you still need to create a user account on JamKazam, so that you can access your affiliate information.'})
+
+ onFailedCreateAffiliatePartner: (jqXHR) =>
+ if jqXHR.status == 422
+ body = JSON.parse(jqXHR.responseText)
+ if body.errors && body.errors.affiliate_partner && body.errors.affiliate_partner[0] == 'You are already an affiliate.'
+ @app.notify({title:'Error', text:'You are already an affiliate.'})
+ else
+ @app.notifyServerError(jqXHR, 'Unable to Create Affiliate')
+ else
+ @app.notifyServerError(jqXHR, 'Unable to Create Affiliate')
+
+ onAgreeClicked: () =>
+ @removeErrors()
+
+ value = @page.find('input:radio[name="entity"]:checked').val()
+
+ error = false
+
+ if value?
+ if value == 'individual'
+ entityType = 'Individual'
+ else
+ # insist that they fill out entity type info
+ entityName = @entityName.val()
+ entityType = @entityType.val()
+
+ entityNameNotEmpty = !!entityName
+ entityTypeNotEmpty = !!entityType
+
+ if !entityNameNotEmpty
+ @fieldEntityName.addClass('error').append('must be specified
')
+ error = true
+
+ if !entityTypeNotEmpty
+ @fieldEntityType.addClass('error').append('must be specified
')
+ error = true
+ else
+ @entityOptions.addClass('error')
+ error = true
+
+ unless error
+ @rest.createAffiliatePartner({partner_name: entityName, entity_type: entityType})
+ .done(@onCreatedAffiliatePartner)
+ .fail(@onFailedCreateAffiliatePartner)
+
+ @disagreeNotice.hide ('hidden')
+ return false
+
+ onDisagreeClicked: () =>
+ @removeErrors()
+
+ @disagreeNotice.slideDown('hidden')
+ return false
+
+ events:() =>
+ @entityRadio.on('change', @onRadioChanged)
+ @agreeBtn.on('click', @onAgreeClicked)
+ @disagreeBtn.on('click', @onDisagreeClicked)
+
+ initialize: () =>
+ @page = $('body')
+ @agreeBtn = @page.find('.agree-button')
+ @disagreeBtn = @page.find('.disagree-button')
+ @entityForm = @page.find('.entity-info')
+ @disagreeNotice = @page.find('.disagree-text')
+ @entityName = @page.find('input[name="entity-name"]')
+ @entityType = @page.find('select[name="entity-type"]')
+ @entityRadio = @page.find('input[name="entity"]')
+ @fieldEntityName = @page.find('.field.entity.name')
+ @fieldEntityType = @page.find('.field.entity.type')
+ @entityOptions = @page.find('.entity-options')
+
+ @events()
+
+context.JK.AffiliateProgram = AffiliateProgram
\ No newline at end of file
diff --git a/web/app/assets/javascripts/web/individual_jamtrack.js b/web/app/assets/javascripts/web/individual_jamtrack.js
index 9eff40023..ebb720f2c 100644
--- a/web/app/assets/javascripts/web/individual_jamtrack.js
+++ b/web/app/assets/javascripts/web/individual_jamtrack.js
@@ -44,12 +44,14 @@
$previews.append($element);
- new context.JK.JamTrackPreview(app, $element, jam_track, track, {master_shows_duration: false, color:'black', master_adds_line_break: true})
+ new context.JK.JamTrackPreview(app, $element, jam_track, track, {master_shows_duration: false, color:'black', master_adds_line_break: true, preload_master:true})
+
+ if(track.track_type =='Master') {
+ context.JK.HelpBubbleHelper.rotateJamTrackLandingBubbles($element.find('.jam-track-preview'), $page.find('.video-wrapper'), $page.find('.cta-free-jamtrack a'), $page.find('a.browse-jamtracks'));
+ }
})
$previews.append('
')
-
-
})
.fail(function () {
app.notify({title: 'Unable to fetch JamTrack', text: "Please refresh the page or try again later."})
diff --git a/web/app/assets/javascripts/web/individual_jamtrack_band.js b/web/app/assets/javascripts/web/individual_jamtrack_band.js
index c05f58772..22ceb52a3 100644
--- a/web/app/assets/javascripts/web/individual_jamtrack_band.js
+++ b/web/app/assets/javascripts/web/individual_jamtrack_band.js
@@ -34,7 +34,11 @@
$previews.append($element);
- new context.JK.JamTrackPreview(app, $element, jam_track, track, {master_shows_duration: false, color:'black', master_adds_line_break:true})
+ new context.JK.JamTrackPreview(app, $element, jam_track, track, {master_shows_duration: false, color:'black', master_adds_line_break:true, preload_master:true})
+
+ if(track.track_type =='Master') {
+ context.JK.HelpBubbleHelper.rotateJamTrackLandingBubbles($element.find('.jam-track-preview'), $page.find('.video-wrapper'), $page.find('.cta-free-jamtrack a'), $page.find('a.browse-jamtracks'));
+ }
})
$previews.append('
')
diff --git a/web/app/assets/javascripts/web/web.js b/web/app/assets/javascripts/web/web.js
index 408eaf41e..89f49d6fe 100644
--- a/web/app/assets/javascripts/web/web.js
+++ b/web/app/assets/javascripts/web/web.js
@@ -1,3 +1,4 @@
+//= require bugsnag
//= require bind-polyfill
//= require jquery
//= require jquery.monkeypatch
@@ -20,6 +21,7 @@
//= require jquery.icheck
//= require jquery.bt
//= require jquery.exists
+//= require jquery.visible
//= require howler.core.js
//= require AAA_Log
//= require AAC_underscore
@@ -65,6 +67,8 @@
//= require web/tracking
//= require web/individual_jamtrack
//= require web/individual_jamtrack_band
+//= require web/affiliate_program
+//= require web/affiliate_links
//= require fakeJamClient
//= require fakeJamClientMessages
//= require fakeJamClientRecordings
diff --git a/web/app/assets/javascripts/wizard/gear/step_select_gear.js b/web/app/assets/javascripts/wizard/gear/step_select_gear.js
index eda4bbe9b..88f07f295 100644
--- a/web/app/assets/javascripts/wizard/gear/step_select_gear.js
+++ b/web/app/assets/javascripts/wizard/gear/step_select_gear.js
@@ -884,7 +884,11 @@
// deal with sample rate
if(selectedDeviceInfo && context.jamClient.FTUESetPreferredMixerSampleRate) {
// get the preferred sample rate for the device, and set that as the initial value of the sample rate dropdown
- if (selectedDeviceInfo.input.info.port_audio_name != 'Default Input') {
+ // except for WKS; we just default to 48
+ if (selectedDeviceInfo.input.info.type == 'Win32_wdm') {
+ var inputSampleRate = 48000;
+ }
+ else if (selectedDeviceInfo.input.info.port_audio_name != 'Default Input') {
var inputSampleRate = context.jamClient.FTUEgetInputDeviceSampleRate(selectedDeviceInfo.input.info.port_audio_name);
}
else {
diff --git a/web/app/assets/javascripts/wizard/gear_utils.js b/web/app/assets/javascripts/wizard/gear_utils.js
index 193bc05ed..d50238724 100644
--- a/web/app/assets/javascripts/wizard/gear_utils.js
+++ b/web/app/assets/javascripts/wizard/gear_utils.js
@@ -197,7 +197,7 @@
}
var devices = context.jamClient.FTUEGetAudioDevices();
- logger.debug("FTUEGetAudioDevices: " + JSON.stringify(devices));
+ //logger.debug("FTUEGetAudioDevices: " + JSON.stringify(devices));
var loadedDevices = {};
diff --git a/web/app/assets/stylesheets/client/account.css.scss b/web/app/assets/stylesheets/client/account.css.scss
index d37147db9..fae2ccd46 100644
--- a/web/app/assets/stylesheets/client/account.css.scss
+++ b/web/app/assets/stylesheets/client/account.css.scss
@@ -21,6 +21,13 @@
}
}
+ hr {
+ height:0;
+ border-width: 1px 0 0 0;
+ border-style:solid;
+ border-color:$ColorTextTypical;
+ }
+
h4 {
margin-top:8px;
margin-bottom: 10px;
@@ -57,7 +64,7 @@
.subcaption {
margin-bottom: 4px;
- }
+ }
}
.webcam-container {
diff --git a/web/app/assets/stylesheets/client/accountProfileSamples.css.scss b/web/app/assets/stylesheets/client/accountProfileSamples.css.scss
index f2c47d585..a6f641d57 100644
--- a/web/app/assets/stylesheets/client/accountProfileSamples.css.scss
+++ b/web/app/assets/stylesheets/client/accountProfileSamples.css.scss
@@ -1,10 +1,26 @@
@import "common.css.scss";
@import "site_validator.css.scss";
-.profile-online-sample-controls {
-
+.profile-online-sample-controls {
+ table.profile-table {
+ width: 100%;
+ tr:nth-child(even) td {
+ padding: 0.25em 0.25em 1em 0.25em;
+ vertical-align: top;
+ }
+ tr:nth-child(odd) td {
+ padding: 0.25em;
+ vertical-align: top;
+ }
+ }
+
+ table.control-table {
+ width: 100%;
+ }
+
.sample-row {
position: relative;
+ clear: both;
}
.sample {
@@ -13,54 +29,13 @@
}
.presence {
- margin: 3px 30px 15px 0px;
-
- input {
- width:200px;
- }
+ margin: 3px 30px 15px 0px;
}
- .samples-container {
- overflow: hidden;
- .samples {
- width: 30%;
- margin: 0.5em;
- label {
- height: 1.5em;
- }
- .controls {
- height: 2em;
- }
- input {
- width: 200px;
- }
-
- .sample {
- margin: 3px 5px 10px 0px;
-
- a.add-recording-source {
- margin-top: 2px !important;
- }
- }
-
- div.sample-list {
- min-height: 150px;
- width: auto;
- min-width: 100px;
- border: 2px solid #ccc;
- overflow: scroll;
- }
-
- div.entry {
- margin-left: 10px;
- margin-top: 5px;
- }
-
- div.close-button {
- margin-right: 15px;
- margin-top: 5px;
- cursor: pointer;
- }
+ .site_validator {
+ a, .spinner-small {
+ margin: 1px 1px 2px 2px;
+ vertical-align: top;
}
}
}
\ No newline at end of file
diff --git a/web/app/assets/stylesheets/client/account_affiliate.css.scss b/web/app/assets/stylesheets/client/account_affiliate.css.scss
new file mode 100644
index 000000000..e1e36f203
--- /dev/null
+++ b/web/app/assets/stylesheets/client/account_affiliate.css.scss
@@ -0,0 +1,201 @@
+@import 'common.css.scss';
+
+#account-affiliate-partner {
+
+
+ p {
+ font-size: 15px;
+ line-height: 125%;
+ margin:0;
+ }
+
+ .affiliates-header {
+ float:left;
+ }
+
+ .affiliate-partner-nav {
+ width:85%;
+ position:relative;
+ float:right;
+ margin-bottom:20px;
+ }
+
+ .affiliate-partner-nav a {
+ width:19%;
+ text-align:center;
+ height: 27px;
+ display: block;
+ float:right;
+ margin-right:5px;
+ vertical-align:bottom;
+ padding-top:10px;
+ background-color:#535353;
+ color:#ccc;
+ font-size:17px;
+ text-decoration:none;
+ }
+
+ .affiliate-partner-nav a:hover {
+ background-color:#666;
+ color:#fff;
+ }
+
+ .affiliate-partner-nav a.active {
+ background-color:#ed3618;
+ color:#fff;
+ }
+
+ .affiliate-partner-nav a.active:hover {
+ background-color:#ed3618;
+ cursor:default;
+ }
+
+ .affiliate-partner-nav a.last {
+ margin-right:0px !important;
+ }
+
+ #affiliate-partner-tab-content {
+ .tab-account {
+ .left-col {
+ float: left;
+ width: 55%;
+ .affiliate-label {
+ text-align: left;
+ width: 130px;
+ float: left;
+ display: inline-block;
+ margin-right: 10px;
+ margin-top: 3px;
+ }
+ input {
+ margin-bottom: 5px;
+ @include border_box_sizing;
+ }
+
+ .button-orange {
+ margin-right:2px;
+ }
+ .spacer {
+ width:140px;
+ display:inline-block;
+ }
+ .input-buttons {
+ width:60%;
+ display:inline-block;
+ }
+ }
+ .right-col {
+ float: right;
+ width: 45%;
+ margin-top: 30px;
+ line-height:125%;
+ }
+ }
+ }
+
+ .links {
+ p.prompt {
+ margin-bottom:20px;
+ }
+ }
+
+ .link-type-section {
+ border-width:0 0 1px 0;
+ border-style:solid;
+ border-color:$ColorTextTypical;
+ padding-bottom:20px;
+ margin-bottom:20px;
+
+ label {
+ display:inline-block;
+ margin-right:20px;
+ }
+ select {
+
+ }
+ }
+
+ .link-type-prompt {
+ display:none;
+
+ p {
+ margin-bottom:20px;
+ }
+
+ .example-link {
+ font-weight:bold;
+ }
+ }
+
+ table.traffic-table {
+ width:400px;
+ .signups, .visits {
+ width:70px;
+ text-align:right;
+ }
+ }
+ table.links-table {
+ min-width:100%;
+ margin-top:20px;
+
+ th {
+ padding: 10px 0 20px;
+ white-space:nowrap;
+ }
+
+ td {
+ padding:3px 0;
+ white-space:nowrap;
+ }
+ .target {
+ width:45%;
+ white-space:normal;
+ }
+ .copy-link {
+ width:100px;
+ }
+
+ .url {
+
+ input {
+ background-color: transparent;
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ color:#ccc;
+ }
+ }
+ }
+
+ .agreement {
+ #partner-agreement-v1 {
+ height:340px;
+ overflow:scroll;
+ padding:20px;
+ border:1px solid white;
+ @include border-box_sizing;
+ }
+
+ label.partner-agreement {
+ display:inline-block;
+ margin-right:40px;
+ }
+
+ h2 {
+ font-size:20px;
+ font-weight:bold;
+ margin:40px 30px 20px 0;
+ display:inline-block;
+ }
+
+ .execution-date {
+ display:inline-block;
+ }
+
+ .input-buttons {
+ margin-top:20px;
+ }
+ }
+
+
+
+}
\ No newline at end of file
diff --git a/web/app/assets/stylesheets/client/client.css b/web/app/assets/stylesheets/client/client.css
index 3296155e8..0e0bee1f1 100644
--- a/web/app/assets/stylesheets/client/client.css
+++ b/web/app/assets/stylesheets/client/client.css
@@ -9,6 +9,7 @@
* compiled file, but it's generally better to create a new file per style scope.
*
*= require_self
+ *= require web/Raleway
*= require jquery.ui.datepicker
*= require ./ie
*= require jquery.bt
@@ -35,6 +36,7 @@
*= require ./accountProfileInterests
*= require ./accountProfileSamples
*= require ./accountPaymentHistory
+ *= require ./account_affiliate
*= require ./search
*= require ./ftue
*= require ./jamServer
@@ -81,4 +83,5 @@
*= require ./downloadJamTrack
*= require ./jamTrackPreview
*= require users/signinCommon
+ *= require landings/partner_agreement_v1
*/
\ No newline at end of file
diff --git a/web/app/assets/stylesheets/client/help.css.scss b/web/app/assets/stylesheets/client/help.css.scss
index b5c3cf17b..1bd085fa4 100644
--- a/web/app/assets/stylesheets/client/help.css.scss
+++ b/web/app/assets/stylesheets/client/help.css.scss
@@ -50,6 +50,8 @@ body.jam, body.web, .dialog{
.big-help {
font-size:20px;
+ color: #ed3618;
+ p {color:#ed3618}
}
.help-hover-recorded-tracks, .help-hover-stream-mix, .help-hover-recorded-backing-tracks {
diff --git a/web/app/assets/stylesheets/client/jamTrackPreview.css.scss b/web/app/assets/stylesheets/client/jamTrackPreview.css.scss
index 37b871e77..c3cae6e81 100644
--- a/web/app/assets/stylesheets/client/jamTrackPreview.css.scss
+++ b/web/app/assets/stylesheets/client/jamTrackPreview.css.scss
@@ -69,6 +69,19 @@
}
}
+ .loading-text {
+ position:absolute;
+ right:-135px;
+ top:0;
+ padding:0 3px;
+ font-style:italic;
+ z-index:1;
+ -webkit-border-radius:10px;
+ -moz-border-radius:10px;
+ border-radius:10px;
+ border:0 solid black;
+ }
+
.adds-line-break {
display:block;
margin-left:66px;
diff --git a/web/app/assets/stylesheets/client/jamkazam.css.scss b/web/app/assets/stylesheets/client/jamkazam.css.scss
index 105946377..af98aad9a 100644
--- a/web/app/assets/stylesheets/client/jamkazam.css.scss
+++ b/web/app/assets/stylesheets/client/jamkazam.css.scss
@@ -24,11 +24,11 @@ body {
height: 100%;
overflow: hidden;
font-size: 14px;
- font-family: Raleway, Arial, Helvetica, sans-serif;
+ font-family: 'Raleway', Arial, Helvetica, sans-serif;
font-weight: 300;
input,textarea {
- font-family: Raleway, Arial, Helvetica, sans-serif;
+ font-family: 'Raleway', Arial, Helvetica, sans-serif;
font-weight: 300;
}
}
@@ -556,22 +556,22 @@ hr {
}
::-webkit-input-placeholder {
- font-family: Raleway, Arial, Helvetica, sans-serif;
+ font-family: 'Raleway', Arial, Helvetica, sans-serif;
font-size:14px;
}
:-moz-placeholder { /* Firefox 18- */
- font-family: Raleway, Arial, Helvetica, sans-serif;
+ font-family: 'Raleway', Arial, Helvetica, sans-serif;
font-size:14px;
}
::-moz-placeholder { /* Firefox 19+ */
- font-family: Raleway, Arial, Helvetica, sans-serif;
+ font-family: 'Raleway', Arial, Helvetica, sans-serif;
font-size:14px;
}
:-ms-input-placeholder {
- font-family: Raleway, Arial, Helvetica, sans-serif;
+ font-family: 'Raleway', Arial, Helvetica, sans-serif;
font-size:14px;
}
diff --git a/web/app/assets/stylesheets/client/jamtrack.css.scss b/web/app/assets/stylesheets/client/jamtrack.css.scss
index 0bbce8be2..7b3a27aaf 100644
--- a/web/app/assets/stylesheets/client/jamtrack.css.scss
+++ b/web/app/assets/stylesheets/client/jamtrack.css.scss
@@ -198,20 +198,21 @@
.jam-track-preview {
font-size:11px;
white-space:nowrap;
+
+ .loading-text {
+ right:-115px;
+ background-color:#262626;
+ }
}
.jamtrack-action {
@include border_box_sizing;
width: 20%;
text-align: center;
+ vertical-align: middle;
.jamtrack-action-container {
- display: flex;
- align-items: center;
- justify-content: center;
- position:absolute;
- height:100%;
- width:100%;
+ display:inline-block;
}
.play-button {
diff --git a/web/app/assets/stylesheets/client/metronomePlaybackModeSelect.css.scss b/web/app/assets/stylesheets/client/metronomePlaybackModeSelect.css.scss
index 7700a57be..79d52c274 100644
--- a/web/app/assets/stylesheets/client/metronomePlaybackModeSelect.css.scss
+++ b/web/app/assets/stylesheets/client/metronomePlaybackModeSelect.css.scss
@@ -7,7 +7,7 @@
overflow:auto;
border:1px solid #ED3618;
text-align:left;
- font-family: Raleway, Arial, Helvetica, sans-serif;
+ font-family: 'Raleway', Arial, Helvetica, sans-serif;
ul {
height:100%;
margin-left:20px;
diff --git a/web/app/assets/stylesheets/client/muteSelect.css.scss b/web/app/assets/stylesheets/client/muteSelect.css.scss
index bd73ce571..c155de69d 100644
--- a/web/app/assets/stylesheets/client/muteSelect.css.scss
+++ b/web/app/assets/stylesheets/client/muteSelect.css.scss
@@ -8,7 +8,7 @@
overflow:auto;
border:1px solid #ED3618;
text-align:center;
- font-family: Raleway, Arial, Helvetica, sans-serif;
+ font-family: 'Raleway', Arial, Helvetica, sans-serif;
ul {
@include vertical-align-column;
height:100%;
diff --git a/web/app/assets/stylesheets/client/sessionList.css.scss b/web/app/assets/stylesheets/client/sessionList.css.scss
index ce326ef9c..c39ee2fcd 100644
--- a/web/app/assets/stylesheets/client/sessionList.css.scss
+++ b/web/app/assets/stylesheets/client/sessionList.css.scss
@@ -1,7 +1,7 @@
@import "client/common";
-table.findsession-table, table.local-recordings, table.open-jam-tracks, table.open-backing-tracks, table.cart-items, #account-session-detail, table.payment-table {
+table.findsession-table, table.local-recordings, table.open-jam-tracks, table.open-backing-tracks, table.cart-items, #account-session-detail, table.payment-table, table.jamtable {
.latency-unacceptable {
width: 50px;
@@ -64,7 +64,7 @@ table.findsession-table, table.local-recordings, table.open-jam-tracks, table.op
text-align:center;
}
}
-table.findsession-table, table.local-recordings, table.open-jam-tracks, table.open-backing-tracks, table.cart-items, table.payment-table {
+table.findsession-table, table.local-recordings, table.open-jam-tracks, table.open-backing-tracks, table.cart-items, table.payment-table, table.jamtable {
width:98%;
height:10%;
font-size:11px;
diff --git a/web/app/assets/stylesheets/corp/corporate.css.scss.erb b/web/app/assets/stylesheets/corp/corporate.css.scss.erb
index 640360bd1..f7e8907f2 100644
--- a/web/app/assets/stylesheets/corp/corporate.css.scss.erb
+++ b/web/app/assets/stylesheets/corp/corporate.css.scss.erb
@@ -1,4 +1,5 @@
/**
+*= require web/Raleway
*= require client/ie
*= require client/jamkazam
*= require client/header
diff --git a/web/app/assets/stylesheets/landing/landing.css b/web/app/assets/stylesheets/landing/landing.css
index c3ce73d41..a37a24675 100644
--- a/web/app/assets/stylesheets/landing/landing.css
+++ b/web/app/assets/stylesheets/landing/landing.css
@@ -1,4 +1,5 @@
/**
+*= require web/Raleway
*= require client/ie
*= require client/jamkazam
*= require client/screen_common
diff --git a/web/app/assets/stylesheets/landings/affiliate_program.css.scss b/web/app/assets/stylesheets/landings/affiliate_program.css.scss
new file mode 100644
index 000000000..f695f5da7
--- /dev/null
+++ b/web/app/assets/stylesheets/landings/affiliate_program.css.scss
@@ -0,0 +1,81 @@
+@import "client/common.css.scss";
+
+body.web.landing_page.full {
+ &.affiliate_program {
+
+ .video-container {
+ width:100%;
+ padding-bottom:53.33%;
+
+ }
+ .agree-disagree-buttons {
+ margin-top:30px;
+ }
+
+ .agree-button {
+ margin-right:20px;
+ }
+
+ #partner-agreement-v1 {
+ height:340px;
+ overflow:scroll;
+ padding:20px;
+ border:1px solid white;
+ @include border-box_sizing;
+ }
+
+ .wrapper {
+ padding-top:20px;
+ }
+ .row {
+ text-align:left;
+ }
+
+ h1 {
+ display: inline-block;
+ margin-bottom:20px;
+ }
+
+ .column {
+ @include border_box_sizing;
+ width:50% ! important;
+ float:left;
+
+ p {
+ margin-bottom:15px;
+ }
+ }
+
+ label {
+ display:inline-block;
+ color:#ccc;
+ }
+
+ p.agreement-notice {
+ color:white;
+ margin:20px 0 30px;
+ }
+
+ .field.radio {
+ margin-top:10px;
+ label {
+ margin-left:10px;
+ }
+ }
+
+ .field.entity {
+ &.name {
+ margin-top:30px;
+ }
+ margin-top:10px;
+ width:400px;
+ input, select {
+ width:300px;
+ @include border_box_sizing;
+ }
+ label {
+ width:100px;
+ }
+ }
+ }
+}
diff --git a/web/app/assets/stylesheets/landings/partner_agreement_v1.css.scss b/web/app/assets/stylesheets/landings/partner_agreement_v1.css.scss
new file mode 100644
index 000000000..647f77f9a
--- /dev/null
+++ b/web/app/assets/stylesheets/landings/partner_agreement_v1.css.scss
@@ -0,0 +1,4667 @@
+#partner-agreement-v1 {
+
+ background-color:#eee;
+ * {
+ color:black! important;
+ background-color:#eee;
+ font-family: 'Raleway', Arial, Helvetica, sans-serif ! important;
+ font-weight: 300 ! important;
+ }
+
+ .c1, .c20 {
+ border-bottom-color: #CCCCCC ! important;
+ border-top-color: #CCCCCC ! important;
+ border-left-color: #CCCCCC ! important;
+ border-right-color: #CCCCCC ! important;
+ }
+
+ .c12 {
+ color: #CCCCCC ! important;
+ }
+
+ ul {
+ list-style-type:none;
+ }
+
+
+
+
+
+
+ .lst-kix_list_39-2 > li:before {
+ content: "\0025aa "
+ }
+
+ .lst-kix_list_30-8 > li:before {
+ content: "\0025aa "
+ }
+
+ .lst-kix_list_22-8 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_6-7 > li:before {
+ content: "" counter(lst-ctn-kix_list_6-0, decimal) "." counter(lst-ctn-kix_list_6-1, decimal) "." counter(lst-ctn-kix_list_6-2, decimal) "." counter(lst-ctn-kix_list_6-3, decimal) "." counter(lst-ctn-kix_list_6-4, decimal) "." counter(lst-ctn-kix_list_6-5, decimal) "." counter(lst-ctn-kix_list_6-6, decimal) "." counter(lst-ctn-kix_list_6-7, decimal) " "
+ }
+
+ .lst-kix_list_34-0 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_21-3 > li:before {
+ content: "" counter(lst-ctn-kix_list_21-0, decimal) "." counter(lst-ctn-kix_list_21-1, decimal) "." counter(lst-ctn-kix_list_21-2, decimal) "." counter(lst-ctn-kix_list_21-3, decimal) " "
+ }
+
+ .lst-kix_list_43-5 > li:before {
+ content: "\0025aa "
+ }
+
+ .lst-kix_list_41-8 > li:before {
+ content: "\0025aa "
+ }
+
+ ul.lst-kix_list_29-6 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_29-5 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_29-8 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_29-7 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_29-2 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_29-1 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_14-7 > li {
+ counter-increment: lst-ctn-kix_list_14-7
+ }
+
+ ul.lst-kix_list_29-4 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_29-3 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_41-3 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_8-5 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_48-6 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_25-2 > li:before {
+ content: "" counter(lst-ctn-kix_list_25-0, decimal) "." counter(lst-ctn-kix_list_25-1, decimal) "." counter(lst-ctn-kix_list_25-2, decimal) " "
+ }
+
+ .lst-kix_list_33-2 > li:before {
+ content: "\0025aa "
+ }
+
+ ol.lst-kix_list_19-1.start {
+ counter-reset: lst-ctn-kix_list_19-1 6
+ }
+
+ .lst-kix_list_21-2 > li {
+ counter-increment: lst-ctn-kix_list_21-2
+ }
+
+ ol.lst-kix_list_16-4.start {
+ counter-reset: lst-ctn-kix_list_16-4 0
+ }
+
+ ul.lst-kix_list_29-0 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_22-1 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_16-7 > li {
+ counter-increment: lst-ctn-kix_list_16-7
+ }
+
+ .lst-kix_list_32-7 > li:before {
+ content: "\0025cf "
+ }
+
+ ol.lst-kix_list_25-2.start {
+ counter-reset: lst-ctn-kix_list_25-2 0
+ }
+
+ .lst-kix_list_18-0 > li:before {
+ content: "" counter(lst-ctn-kix_list_18-0, decimal) " "
+ }
+
+ .lst-kix_list_38-4 > li:before {
+ content: "o "
+ }
+
+ .lst-kix_list_13-4 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_5-2 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_9-1 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_18-0 > li {
+ counter-increment: lst-ctn-kix_list_18-0
+ }
+
+ .lst-kix_list_15-8 > li:before {
+ content: "" counter(lst-ctn-kix_list_15-0, decimal) "." counter(lst-ctn-kix_list_15-1, decimal) "." counter(lst-ctn-kix_list_15-2, decimal) "." counter(lst-ctn-kix_list_15-3, decimal) "." counter(lst-ctn-kix_list_15-4, decimal) "." counter(lst-ctn-kix_list_15-5, decimal) "." counter(lst-ctn-kix_list_15-6, decimal) "." counter(lst-ctn-kix_list_15-7, decimal) "." counter(lst-ctn-kix_list_15-8, decimal) " "
+ }
+
+ .lst-kix_list_7-2 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_21-0 > li {
+ counter-increment: lst-ctn-kix_list_21-0
+ }
+
+ .lst-kix_list_37-6 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_37-5 > li:before {
+ content: "\0025aa "
+ }
+
+ .lst-kix_list_17-8 > li {
+ counter-increment: lst-ctn-kix_list_17-8
+ }
+
+ .lst-kix_list_40-2 > li:before {
+ content: "\0025aa "
+ }
+
+ ol.lst-kix_list_18-3.start {
+ counter-reset: lst-ctn-kix_list_18-3 0
+ }
+
+ .lst-kix_list_19-8 > li {
+ counter-increment: lst-ctn-kix_list_19-8
+ }
+
+ .lst-kix_list_31-7 > li:before {
+ content: "o "
+ }
+
+ .lst-kix_list_36-4 > li:before {
+ content: "o "
+ }
+
+ .lst-kix_list_9-3 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_6-0 > li {
+ counter-increment: lst-ctn-kix_list_6-0
+ }
+
+ ol.lst-kix_list_11-0 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_9-6 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_2-0 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_42-1 > li {
+ counter-increment: lst-ctn-kix_list_42-1
+ }
+
+ .lst-kix_list_28-7 > li:before {
+ content: "o "
+ }
+
+ .lst-kix_list_2-4 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_45-5 > li:before {
+ content: "\0025aa "
+ }
+
+ ol.lst-kix_list_15-6 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_15-7 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_15-8 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_37-4 > li:before {
+ content: "o "
+ }
+
+ ol.lst-kix_list_15-0 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_12-7 > li:before {
+ content: "\0025cf "
+ }
+
+ ol.lst-kix_list_15-1 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_15-2 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_15-3 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_15-4 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_15-5 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_21-4 > li:before {
+ content: "" counter(lst-ctn-kix_list_21-0, decimal) "." counter(lst-ctn-kix_list_21-1, decimal) "." counter(lst-ctn-kix_list_21-2, decimal) "." counter(lst-ctn-kix_list_21-3, decimal) "." counter(lst-ctn-kix_list_21-4, decimal) " "
+ }
+
+ .lst-kix_list_41-2 > li:before {
+ content: "\0025aa "
+ }
+
+ .lst-kix_list_34-6 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_35-7 > li:before {
+ content: "o "
+ }
+
+ ol.lst-kix_list_17-3.start {
+ counter-reset: lst-ctn-kix_list_17-3 0
+ }
+
+ ol.lst-kix_list_21-6 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_21-5 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_21-4 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_21-3 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_6-5.start {
+ counter-reset: lst-ctn-kix_list_6-5 0
+ }
+
+ ol.lst-kix_list_21-8 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_8-1 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_31-2 > li:before {
+ content: "\0025aa "
+ }
+
+ ol.lst-kix_list_21-7 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_8-0 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_17-6 > li {
+ counter-increment: lst-ctn-kix_list_17-6
+ }
+
+ .lst-kix_list_46-6 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_18-3 > li:before {
+ content: "" counter(lst-ctn-kix_list_18-0, decimal) "." counter(lst-ctn-kix_list_18-1, decimal) "." counter(lst-ctn-kix_list_18-2, decimal) "." counter(lst-ctn-kix_list_18-3, decimal) " "
+ }
+
+ .lst-kix_list_41-7 > li:before {
+ content: "o "
+ }
+
+ ol.lst-kix_list_21-1 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_21-2 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_21-0 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_33-3 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_46-7 > li:before {
+ content: "o "
+ }
+
+ .lst-kix_list_25-7 > li:before {
+ content: "" counter(lst-ctn-kix_list_25-0, decimal) "." counter(lst-ctn-kix_list_25-1, decimal) "." counter(lst-ctn-kix_list_25-2, decimal) "." counter(lst-ctn-kix_list_25-3, decimal) "." counter(lst-ctn-kix_list_25-4, decimal) "." counter(lst-ctn-kix_list_25-5, decimal) "." counter(lst-ctn-kix_list_25-6, decimal) "." counter(lst-ctn-kix_list_25-7, decimal) " "
+ }
+
+ .lst-kix_list_45-6 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_4-0 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_27-3 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_16-8 > li:before {
+ content: "" counter(lst-ctn-kix_list_16-0, decimal) "." counter(lst-ctn-kix_list_16-1, decimal) "." counter(lst-ctn-kix_list_16-2, decimal) "." counter(lst-ctn-kix_list_16-3, decimal) "." counter(lst-ctn-kix_list_16-4, decimal) "." counter(lst-ctn-kix_list_16-5, decimal) "." counter(lst-ctn-kix_list_16-6, decimal) "." counter(lst-ctn-kix_list_16-7, decimal) "." counter(lst-ctn-kix_list_16-8, decimal) " "
+ }
+
+ ol.lst-kix_list_20-5.start {
+ counter-reset: lst-ctn-kix_list_20-5 0
+ }
+
+ .lst-kix_list_10-7 > li:before {
+ content: "\0025cf "
+ }
+
+ ol.lst-kix_list_19-7 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_14-6 > li:before {
+ content: "" counter(lst-ctn-kix_list_14-0, decimal) "." counter(lst-ctn-kix_list_14-1, decimal) "." counter(lst-ctn-kix_list_14-2, decimal) "." counter(lst-ctn-kix_list_14-3, decimal) "." counter(lst-ctn-kix_list_14-4, decimal) "." counter(lst-ctn-kix_list_14-5, decimal) "." counter(lst-ctn-kix_list_14-6, decimal) " "
+ }
+
+ ol.lst-kix_list_19-6 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_19-8 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_19-3 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_19-2 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_10-1 > li:before {
+ content: "\0025cf "
+ }
+
+ ol.lst-kix_list_19-5 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_19-4 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_19-1 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_13-1 > li:before {
+ content: "\0025cf "
+ }
+
+ ol.lst-kix_list_19-0 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_23-6 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_18-8 > li {
+ counter-increment: lst-ctn-kix_list_18-8
+ }
+
+ ol.lst-kix_list_20-4.start {
+ counter-reset: lst-ctn-kix_list_20-4 0
+ }
+
+ ol.lst-kix_list_18-5.start {
+ counter-reset: lst-ctn-kix_list_18-5 0
+ }
+
+ ol.lst-kix_list_6-3.start {
+ counter-reset: lst-ctn-kix_list_6-3 0
+ }
+
+ .lst-kix_list_8-6 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_1-5 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_25-3 > li:before {
+ content: "" counter(lst-ctn-kix_list_25-0, decimal) "." counter(lst-ctn-kix_list_25-1, decimal) "." counter(lst-ctn-kix_list_25-2, decimal) "." counter(lst-ctn-kix_list_25-3, decimal) " "
+ }
+
+ .lst-kix_list_29-0 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_40-0 > li:before {
+ content: "\00f031 "
+ }
+
+ .lst-kix_list_24-1 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_2-3 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_20-8 > li {
+ counter-increment: lst-ctn-kix_list_20-8
+ }
+
+ .lst-kix_list_13-8 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_16-0 > li {
+ counter-increment: lst-ctn-kix_list_16-0
+ }
+
+ .lst-kix_list_42-6 > li:before {
+ content: "" counter(lst-ctn-kix_list_42-6, decimal) ". "
+ }
+
+ ul.lst-kix_list_34-8 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_42-2 > li:before {
+ content: "" counter(lst-ctn-kix_list_42-2, lower-roman) ". "
+ }
+
+ ul.lst-kix_list_34-7 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_34-3 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_34-4 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_34-5 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_39-6 > li:before {
+ content: "\0025cf "
+ }
+
+ ul.lst-kix_list_34-6 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_36-8 > li:before {
+ content: "\0025aa "
+ }
+
+ .lst-kix_list_47-6 > li:before {
+ content: "\0025cf "
+ }
+
+ ul.lst-kix_list_34-0 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_34-1 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_34-2 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_20-2 > li:before {
+ content: "" counter(lst-ctn-kix_list_20-0, decimal) "." counter(lst-ctn-kix_list_20-1, decimal) "." counter(lst-ctn-kix_list_20-2, decimal) " "
+ }
+
+ .lst-kix_list_10-6 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_21-5 > li:before {
+ content: "" counter(lst-ctn-kix_list_21-0, decimal) "." counter(lst-ctn-kix_list_21-1, decimal) "." counter(lst-ctn-kix_list_21-2, decimal) "." counter(lst-ctn-kix_list_21-3, decimal) "." counter(lst-ctn-kix_list_21-4, decimal) "." counter(lst-ctn-kix_list_21-5, decimal) " "
+ }
+
+ ol.lst-kix_list_15-3.start {
+ counter-reset: lst-ctn-kix_list_15-3 0
+ }
+
+ ul.lst-kix_list_40-8 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_40-7 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_40-6 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_49-0 > li:before {
+ content: "\0025cf "
+ }
+
+ ul.lst-kix_list_40-5 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_40-4 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_40-3 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_11-0.start {
+ counter-reset: lst-ctn-kix_list_11-0 0
+ }
+
+ .lst-kix_list_15-5 > li {
+ counter-increment: lst-ctn-kix_list_15-5
+ }
+
+ ul.lst-kix_list_40-2 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_10-2 > li:before {
+ content: "\0025cf "
+ }
+
+ ul.lst-kix_list_40-1 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_20-7 > li:before {
+ content: "" counter(lst-ctn-kix_list_20-0, decimal) "." counter(lst-ctn-kix_list_20-1, decimal) "." counter(lst-ctn-kix_list_20-2, decimal) "." counter(lst-ctn-kix_list_20-3, decimal) "." counter(lst-ctn-kix_list_20-4, decimal) "." counter(lst-ctn-kix_list_20-5, decimal) "." counter(lst-ctn-kix_list_20-6, decimal) "." counter(lst-ctn-kix_list_20-7, decimal) " "
+ }
+
+ ul.lst-kix_list_40-0 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_21-4 > li {
+ counter-increment: lst-ctn-kix_list_21-4
+ }
+
+ .lst-kix_list_6-1 > li:before {
+ content: "" counter(lst-ctn-kix_list_6-0, decimal) "." counter(lst-ctn-kix_list_6-1, decimal) " "
+ }
+
+ .lst-kix_list_36-1 > li:before {
+ content: "o "
+ }
+
+ .lst-kix_list_41-0 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_17-0 > li:before {
+ content: "" counter(lst-ctn-kix_list_17-0, decimal) " "
+ }
+
+ .lst-kix_list_38-3 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_13-3 > li:before {
+ content: "\0025cf "
+ }
+
+ ul.lst-kix_list_44-8 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_35-1 > li:before {
+ content: "o "
+ }
+
+ ul.lst-kix_list_44-4 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_14-7 > li:before {
+ content: "" counter(lst-ctn-kix_list_14-0, decimal) "." counter(lst-ctn-kix_list_14-1, decimal) "." counter(lst-ctn-kix_list_14-2, decimal) "." counter(lst-ctn-kix_list_14-3, decimal) "." counter(lst-ctn-kix_list_14-4, decimal) "." counter(lst-ctn-kix_list_14-5, decimal) "." counter(lst-ctn-kix_list_14-6, decimal) "." counter(lst-ctn-kix_list_14-7, decimal) " "
+ }
+
+ ul.lst-kix_list_44-5 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_44-6 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_44-7 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_44-0 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_44-1 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_44-2 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_44-3 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_40-6 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_23-0 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_33-0 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_12-6 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_39-0 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_32-0 > li:before {
+ content: "" counter(lst-ctn-kix_list_32-0, decimal) ". "
+ }
+
+ .lst-kix_list_3-7 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_49-8 > li:before {
+ content: "\0025aa "
+ }
+
+ .lst-kix_list_44-7 > li:before {
+ content: "o "
+ }
+
+ ul.lst-kix_list_13-2 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_13-3 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_13-4 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_13-5 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_13-0 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_13-1 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_12-8 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_39-8 > li:before {
+ content: "\0025aa "
+ }
+
+ ul.lst-kix_list_13-7 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_13-6 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_36-2 > li:before {
+ content: "\0025aa "
+ }
+
+ ul.lst-kix_list_13-8 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_9-8 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_16-1 > li:before {
+ content: "" counter(lst-ctn-kix_list_16-0, decimal) "." counter(lst-ctn-kix_list_16-1, decimal) " "
+ }
+
+ .lst-kix_list_42-7 > li {
+ counter-increment: lst-ctn-kix_list_42-7
+ }
+
+ .lst-kix_list_8-0 > li:before {
+ content: "" counter(lst-ctn-kix_list_8-0, lower-latin) ". "
+ }
+
+ ul.lst-kix_list_47-6 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_24-5 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_38-1 > li:before {
+ content: "o "
+ }
+
+ ul.lst-kix_list_47-5 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_47-8 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_20-1 > li:before {
+ content: "" counter(lst-ctn-kix_list_20-0, decimal) "." counter(lst-ctn-kix_list_20-1, decimal) " "
+ }
+
+ ul.lst-kix_list_47-7 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_49-0 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_15-6.start {
+ counter-reset: lst-ctn-kix_list_15-6 0
+ }
+
+ ul.lst-kix_list_49-2 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_49-1 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_49-3 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_49-4 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_49-5 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_47-0 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_49-6 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_47-1 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_40-8 > li:before {
+ content: "\0025aa "
+ }
+
+ ul.lst-kix_list_49-7 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_47-2 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_49-8 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_47-3 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_47-4 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_29-2 > li:before {
+ content: "\0025aa "
+ }
+
+ .lst-kix_list_29-8 > li:before {
+ content: "\0025aa "
+ }
+
+ .lst-kix_list_35-6 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_10-3 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_23-5 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_16-1 > li {
+ counter-increment: lst-ctn-kix_list_16-1
+ }
+
+ .lst-kix_list_7-4 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_34-3 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_18-7 > li {
+ counter-increment: lst-ctn-kix_list_18-7
+ }
+
+ ol.lst-kix_list_16-8.start {
+ counter-reset: lst-ctn-kix_list_16-8 0
+ }
+
+ ol.lst-kix_list_20-3.start {
+ counter-reset: lst-ctn-kix_list_20-3 0
+ }
+
+ ol.lst-kix_list_25-6.start {
+ counter-reset: lst-ctn-kix_list_25-6 0
+ }
+
+ .lst-kix_list_36-3 > li:before {
+ content: "\0025cf "
+ }
+
+ ol.lst-kix_list_19-4.start {
+ counter-reset: lst-ctn-kix_list_19-4 0
+ }
+
+ .lst-kix_list_24-2 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_40-7 > li:before {
+ content: "o "
+ }
+
+ .lst-kix_list_8-2 > li:before {
+ content: "\0025cf "
+ }
+
+ ol.lst-kix_list_21-6.start {
+ counter-reset: lst-ctn-kix_list_21-6 0
+ }
+
+ .lst-kix_list_14-3 > li:before {
+ content: "" counter(lst-ctn-kix_list_14-0, decimal) "." counter(lst-ctn-kix_list_14-1, decimal) "." counter(lst-ctn-kix_list_14-2, decimal) "." counter(lst-ctn-kix_list_14-3, decimal) " "
+ }
+
+ .lst-kix_list_8-8 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_30-2 > li:before {
+ content: "\0025aa "
+ }
+
+ ol.lst-kix_list_16-1.start {
+ counter-reset: lst-ctn-kix_list_16-1 1
+ }
+
+ ol.lst-kix_list_20-6.start {
+ counter-reset: lst-ctn-kix_list_20-6 0
+ }
+
+ ul.lst-kix_list_36-7 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_36-8 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_36-5 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_36-6 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_19-3.start {
+ counter-reset: lst-ctn-kix_list_19-3 0
+ }
+
+ .lst-kix_list_48-3 > li:before {
+ content: "\0025cf "
+ }
+
+ ol.lst-kix_list_6-2.start {
+ counter-reset: lst-ctn-kix_list_6-2 0
+ }
+
+ ol.lst-kix_list_17-1.start {
+ counter-reset: lst-ctn-kix_list_17-1 1
+ }
+
+ ol.lst-kix_list_42-3.start {
+ counter-reset: lst-ctn-kix_list_42-3 0
+ }
+
+ ul.lst-kix_list_9-0 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_22-4 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_38-8 > li:before {
+ content: "\0025aa "
+ }
+
+ ul.lst-kix_list_9-8 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_36-0 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_9-7 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_19-6 > li:before {
+ content: "" counter(lst-ctn-kix_list_19-0, decimal) "." counter(lst-ctn-kix_list_19-1, decimal) "." counter(lst-ctn-kix_list_19-2, decimal) "." counter(lst-ctn-kix_list_19-3, decimal) "." counter(lst-ctn-kix_list_19-4, decimal) "." counter(lst-ctn-kix_list_19-5, decimal) "." counter(lst-ctn-kix_list_19-6, decimal) " "
+ }
+
+ ul.lst-kix_list_9-6 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_43-7 > li:before {
+ content: "o "
+ }
+
+ ul.lst-kix_list_9-5 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_13-6 > li:before {
+ content: "\0025cf "
+ }
+
+ ul.lst-kix_list_9-4 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_36-4 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_9-3 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_36-3 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_46-4 > li:before {
+ content: "o "
+ }
+
+ ul.lst-kix_list_9-2 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_36-2 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_9-1 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_36-1 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_5-1 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_5-2 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_5-3 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_5-4 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_10-0 > li:before {
+ content: "" counter(lst-ctn-kix_list_10-0, lower-latin) ". "
+ }
+
+ .lst-kix_list_17-7 > li:before {
+ content: "" counter(lst-ctn-kix_list_17-0, decimal) "." counter(lst-ctn-kix_list_17-1, decimal) "." counter(lst-ctn-kix_list_17-2, decimal) "." counter(lst-ctn-kix_list_17-3, decimal) "." counter(lst-ctn-kix_list_17-4, decimal) "." counter(lst-ctn-kix_list_17-5, decimal) "." counter(lst-ctn-kix_list_17-6, decimal) "." counter(lst-ctn-kix_list_17-7, decimal) " "
+ }
+
+ .lst-kix_list_40-5 > li:before {
+ content: "\0025aa "
+ }
+
+ ul.lst-kix_list_5-0 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_37-1 > li:before {
+ content: "o "
+ }
+
+ .lst-kix_list_13-2 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_31-0 > li:before {
+ content: "\0025a1 "
+ }
+
+ .lst-kix_list_42-6 > li {
+ counter-increment: lst-ctn-kix_list_42-6
+ }
+
+ ul.lst-kix_list_5-5 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_5-6 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_5-7 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_5-8 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_7-8 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_7-7 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_4-3 > li:before {
+ content: "\0025cf "
+ }
+
+ ul.lst-kix_list_7-4 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_7-3 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_7-6 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_7-5 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_7-2 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_7-1 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_19-4 > li:before {
+ content: "" counter(lst-ctn-kix_list_19-0, decimal) "." counter(lst-ctn-kix_list_19-1, decimal) "." counter(lst-ctn-kix_list_19-2, decimal) "." counter(lst-ctn-kix_list_19-3, decimal) "." counter(lst-ctn-kix_list_19-4, decimal) " "
+ }
+
+ .lst-kix_list_14-1 > li:before {
+ content: "" counter(lst-ctn-kix_list_14-0, decimal) "." counter(lst-ctn-kix_list_14-1, decimal) " "
+ }
+
+ .lst-kix_list_30-4 > li:before {
+ content: "o "
+ }
+
+ ol.lst-kix_list_15-7.start {
+ counter-reset: lst-ctn-kix_list_15-7 0
+ }
+
+ .lst-kix_list_6-8 > li:before {
+ content: "" counter(lst-ctn-kix_list_6-0, decimal) "." counter(lst-ctn-kix_list_6-1, decimal) "." counter(lst-ctn-kix_list_6-2, decimal) "." counter(lst-ctn-kix_list_6-3, decimal) "." counter(lst-ctn-kix_list_6-4, decimal) "." counter(lst-ctn-kix_list_6-5, decimal) "." counter(lst-ctn-kix_list_6-6, decimal) "." counter(lst-ctn-kix_list_6-7, decimal) "." counter(lst-ctn-kix_list_6-8, decimal) " "
+ }
+
+ .lst-kix_list_37-2 > li:before {
+ content: "\0025aa "
+ }
+
+ ul.lst-kix_list_3-7 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_3-8 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_1-6 > li:before {
+ content: "\0025cf "
+ }
+
+ ul.lst-kix_list_3-0 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_3-1 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_3-2 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_3-3 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_16-6 > li {
+ counter-increment: lst-ctn-kix_list_16-6
+ }
+
+ ul.lst-kix_list_3-4 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_3-5 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_1-0 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_3-6 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_16-7 > li:before {
+ content: "" counter(lst-ctn-kix_list_16-0, decimal) "." counter(lst-ctn-kix_list_16-1, decimal) "." counter(lst-ctn-kix_list_16-2, decimal) "." counter(lst-ctn-kix_list_16-3, decimal) "." counter(lst-ctn-kix_list_16-4, decimal) "." counter(lst-ctn-kix_list_16-5, decimal) "." counter(lst-ctn-kix_list_16-6, decimal) "." counter(lst-ctn-kix_list_16-7, decimal) " "
+ }
+
+ .lst-kix_list_41-5 > li:before {
+ content: "\0025aa "
+ }
+
+ ul.lst-kix_list_1-2 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_1-1 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_29-6 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_35-4 > li:before {
+ content: "o "
+ }
+
+ ul.lst-kix_list_1-4 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_6-8 > li {
+ counter-increment: lst-ctn-kix_list_6-8
+ }
+
+ ul.lst-kix_list_1-3 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_1-6 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_1-5 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_1-8 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_1-7 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_19-5.start {
+ counter-reset: lst-ctn-kix_list_19-5 0
+ }
+
+ .lst-kix_list_2-1 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_4-8 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_36-5 > li:before {
+ content: "\0025aa "
+ }
+
+ .lst-kix_list_30-6 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_15-6 > li {
+ counter-increment: lst-ctn-kix_list_15-6
+ }
+
+ .lst-kix_list_31-1 > li:before {
+ content: "o "
+ }
+
+ .lst-kix_list_48-1 > li:before {
+ content: "o "
+ }
+
+ .lst-kix_list_43-2 > li:before {
+ content: "\0025aa "
+ }
+
+ .lst-kix_list_25-3 > li {
+ counter-increment: lst-ctn-kix_list_25-3
+ }
+
+ .lst-kix_list_47-5 > li:before {
+ content: "\0025aa "
+ }
+
+ .lst-kix_list_38-7 > li:before {
+ content: "o "
+ }
+
+ .lst-kix_list_42-4 > li {
+ counter-increment: lst-ctn-kix_list_42-4
+ }
+
+ ul.lst-kix_list_11-3 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_47-0 > li:before {
+ content: "\0025cf "
+ }
+
+ ul.lst-kix_list_11-2 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_42-6.start {
+ counter-reset: lst-ctn-kix_list_42-6 0
+ }
+
+ ul.lst-kix_list_11-1 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_20-8.start {
+ counter-reset: lst-ctn-kix_list_20-8 0
+ }
+
+ ul.lst-kix_list_11-7 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_11-6 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_11-5 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_22-7 > li:before {
+ content: "\0025cf "
+ }
+
+ ul.lst-kix_list_11-4 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_46-8 > li:before {
+ content: "\0025aa "
+ }
+
+ .lst-kix_list_14-1 > li {
+ counter-increment: lst-ctn-kix_list_14-1
+ }
+
+ .lst-kix_list_45-0 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_4-1 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_21-0 > li:before {
+ content: "" counter(lst-ctn-kix_list_21-0, decimal) " "
+ }
+
+ .lst-kix_list_35-0 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_1-0 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_28-0 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_21-3 > li {
+ counter-increment: lst-ctn-kix_list_21-3
+ }
+
+ .lst-kix_list_21-6 > li {
+ counter-increment: lst-ctn-kix_list_21-6
+ }
+
+ ul.lst-kix_list_11-8 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_31-8 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_17-0 > li {
+ counter-increment: lst-ctn-kix_list_17-0
+ }
+
+ .lst-kix_list_1-3 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_8-3 > li:before {
+ content: "\0025cf "
+ }
+
+ ul.lst-kix_list_31-6 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_31-7 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_31-4 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_31-5 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_14-0 > li:before {
+ content: "" counter(lst-ctn-kix_list_14-0, decimal) " "
+ }
+
+ ul.lst-kix_list_31-2 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_20-7.start {
+ counter-reset: lst-ctn-kix_list_20-7 0
+ }
+
+ ul.lst-kix_list_31-3 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_31-0 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_19-1 > li {
+ counter-increment: lst-ctn-kix_list_19-1
+ }
+
+ .lst-kix_list_12-0 > li:before {
+ content: "\002751 "
+ }
+
+ .lst-kix_list_29-7 > li:before {
+ content: "o "
+ }
+
+ ul.lst-kix_list_31-1 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_15-2.start {
+ counter-reset: lst-ctn-kix_list_15-2 0
+ }
+
+ .lst-kix_list_44-3 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_15-7 > li:before {
+ content: "" counter(lst-ctn-kix_list_15-0, decimal) "." counter(lst-ctn-kix_list_15-1, decimal) "." counter(lst-ctn-kix_list_15-2, decimal) "." counter(lst-ctn-kix_list_15-3, decimal) "." counter(lst-ctn-kix_list_15-4, decimal) "." counter(lst-ctn-kix_list_15-5, decimal) "." counter(lst-ctn-kix_list_15-6, decimal) "." counter(lst-ctn-kix_list_15-7, decimal) " "
+ }
+
+ .lst-kix_list_21-7 > li:before {
+ content: "" counter(lst-ctn-kix_list_21-0, decimal) "." counter(lst-ctn-kix_list_21-1, decimal) "." counter(lst-ctn-kix_list_21-2, decimal) "." counter(lst-ctn-kix_list_21-3, decimal) "." counter(lst-ctn-kix_list_21-4, decimal) "." counter(lst-ctn-kix_list_21-5, decimal) "." counter(lst-ctn-kix_list_21-6, decimal) "." counter(lst-ctn-kix_list_21-7, decimal) " "
+ }
+
+ ol.lst-kix_list_15-0.start {
+ counter-reset: lst-ctn-kix_list_15-0 3
+ }
+
+ ol.lst-kix_list_21-5.start {
+ counter-reset: lst-ctn-kix_list_21-5 0
+ }
+
+ .lst-kix_list_42-0 > li:before {
+ content: "(" counter(lst-ctn-kix_list_42-0, lower-roman) ") "
+ }
+
+ .lst-kix_list_21-8 > li {
+ counter-increment: lst-ctn-kix_list_21-8
+ }
+
+ .lst-kix_list_26-0 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_19-5 > li:before {
+ content: "" counter(lst-ctn-kix_list_19-0, decimal) "." counter(lst-ctn-kix_list_19-1, decimal) "." counter(lst-ctn-kix_list_19-2, decimal) "." counter(lst-ctn-kix_list_19-3, decimal) "." counter(lst-ctn-kix_list_19-4, decimal) "." counter(lst-ctn-kix_list_19-5, decimal) " "
+ }
+
+ ol.lst-kix_list_42-1.start {
+ counter-reset: lst-ctn-kix_list_42-1 0
+ }
+
+ .lst-kix_list_32-0 > li {
+ counter-increment: lst-ctn-kix_list_32-0
+ }
+
+ .lst-kix_list_35-2 > li:before {
+ content: "\0025aa "
+ }
+
+ .lst-kix_list_7-8 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_25-1 > li:before {
+ content: "" counter(lst-ctn-kix_list_25-0, decimal) "." counter(lst-ctn-kix_list_25-1, decimal) " "
+ }
+
+ .lst-kix_list_24-3 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_15-1 > li {
+ counter-increment: lst-ctn-kix_list_15-1
+ }
+
+ .lst-kix_list_13-7 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_28-6 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_33-8 > li:before {
+ content: "\0025aa "
+ }
+
+ .lst-kix_list_5-1 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_44-0 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_1-1 > li:before {
+ content: "\0025cf "
+ }
+
+ ol.lst-kix_list_14-0.start {
+ counter-reset: lst-ctn-kix_list_14-0 0
+ }
+
+ .lst-kix_list_32-4 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_25-5 > li:before {
+ content: "" counter(lst-ctn-kix_list_25-0, decimal) "." counter(lst-ctn-kix_list_25-1, decimal) "." counter(lst-ctn-kix_list_25-2, decimal) "." counter(lst-ctn-kix_list_25-3, decimal) "." counter(lst-ctn-kix_list_25-4, decimal) "." counter(lst-ctn-kix_list_25-5, decimal) " "
+ }
+
+ .lst-kix_list_15-1 > li:before {
+ content: "" counter(lst-ctn-kix_list_15-0, decimal) "." counter(lst-ctn-kix_list_15-1, decimal) " "
+ }
+
+ ol.lst-kix_list_18-8.start {
+ counter-reset: lst-ctn-kix_list_18-8 0
+ }
+
+ .lst-kix_list_23-7 > li:before {
+ content: "\0025cf "
+ }
+
+ ol.lst-kix_list_17-2.start {
+ counter-reset: lst-ctn-kix_list_17-2 0
+ }
+
+ .lst-kix_list_20-8 > li:before {
+ content: "" counter(lst-ctn-kix_list_20-0, decimal) "." counter(lst-ctn-kix_list_20-1, decimal) "." counter(lst-ctn-kix_list_20-2, decimal) "." counter(lst-ctn-kix_list_20-3, decimal) "." counter(lst-ctn-kix_list_20-4, decimal) "." counter(lst-ctn-kix_list_20-5, decimal) "." counter(lst-ctn-kix_list_20-6, decimal) "." counter(lst-ctn-kix_list_20-7, decimal) "." counter(lst-ctn-kix_list_20-8, decimal) " "
+ }
+
+ .lst-kix_list_11-7 > li:before {
+ content: "\0025cf "
+ }
+
+ ul.lst-kix_list_38-2 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_16-5 > li {
+ counter-increment: lst-ctn-kix_list_16-5
+ }
+
+ ul.lst-kix_list_38-1 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_38-0 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_5-7 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_25-6 > li:before {
+ content: "" counter(lst-ctn-kix_list_25-0, decimal) "." counter(lst-ctn-kix_list_25-1, decimal) "." counter(lst-ctn-kix_list_25-2, decimal) "." counter(lst-ctn-kix_list_25-3, decimal) "." counter(lst-ctn-kix_list_25-4, decimal) "." counter(lst-ctn-kix_list_25-5, decimal) "." counter(lst-ctn-kix_list_25-6, decimal) " "
+ }
+
+ .lst-kix_list_40-4 > li:before {
+ content: "o "
+ }
+
+ .lst-kix_list_9-4 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_34-8 > li:before {
+ content: "\0025aa "
+ }
+
+ ol.lst-kix_list_15-8.start {
+ counter-reset: lst-ctn-kix_list_15-8 0
+ }
+
+ .lst-kix_list_45-4 > li:before {
+ content: "o "
+ }
+
+ .lst-kix_list_18-1 > li:before {
+ content: "" counter(lst-ctn-kix_list_18-0, decimal) "." counter(lst-ctn-kix_list_18-1, decimal) " "
+ }
+
+ ul.lst-kix_list_38-5 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_42-2.start {
+ counter-reset: lst-ctn-kix_list_42-2 0
+ }
+
+ ul.lst-kix_list_38-6 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_38-3 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_47-2 > li:before {
+ content: "\0025aa "
+ }
+
+ ul.lst-kix_list_38-4 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_38-7 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_38-8 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_27-1 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_27-2 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_26-5 > li:before {
+ content: "\0025aa "
+ }
+
+ .lst-kix_list_19-2 > li:before {
+ content: "" counter(lst-ctn-kix_list_19-0, decimal) "." counter(lst-ctn-kix_list_19-1, decimal) "." counter(lst-ctn-kix_list_19-2, decimal) " "
+ }
+
+ ul.lst-kix_list_27-0 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_25-7.start {
+ counter-reset: lst-ctn-kix_list_25-7 0
+ }
+
+ .lst-kix_list_19-8 > li:before {
+ content: "" counter(lst-ctn-kix_list_19-0, decimal) "." counter(lst-ctn-kix_list_19-1, decimal) "." counter(lst-ctn-kix_list_19-2, decimal) "." counter(lst-ctn-kix_list_19-3, decimal) "." counter(lst-ctn-kix_list_19-4, decimal) "." counter(lst-ctn-kix_list_19-5, decimal) "." counter(lst-ctn-kix_list_19-6, decimal) "." counter(lst-ctn-kix_list_19-7, decimal) "." counter(lst-ctn-kix_list_19-8, decimal) " "
+ }
+
+ .lst-kix_list_16-2 > li:before {
+ content: "" counter(lst-ctn-kix_list_16-0, decimal) "." counter(lst-ctn-kix_list_16-1, decimal) "." counter(lst-ctn-kix_list_16-2, decimal) " "
+ }
+
+ ol.lst-kix_list_16-5.start {
+ counter-reset: lst-ctn-kix_list_16-5 0
+ }
+
+ ol.lst-kix_list_25-5.start {
+ counter-reset: lst-ctn-kix_list_25-5 0
+ }
+
+ .lst-kix_list_18-2 > li:before {
+ content: "" counter(lst-ctn-kix_list_18-0, decimal) "." counter(lst-ctn-kix_list_18-1, decimal) "." counter(lst-ctn-kix_list_18-2, decimal) " "
+ }
+
+ .lst-kix_list_42-2 > li {
+ counter-increment: lst-ctn-kix_list_42-2
+ }
+
+ .lst-kix_list_18-1 > li {
+ counter-increment: lst-ctn-kix_list_18-1
+ }
+
+ .lst-kix_list_9-5 > li:before {
+ content: "\0025cf "
+ }
+
+ ul.lst-kix_list_27-8 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_27-7 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_27-6 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_27-5 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_27-4 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_25-1.start {
+ counter-reset: lst-ctn-kix_list_25-1 0
+ }
+
+ ul.lst-kix_list_27-3 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_19-7.start {
+ counter-reset: lst-ctn-kix_list_19-7 0
+ }
+
+ .lst-kix_list_2-6 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_6-5 > li:before {
+ content: "" counter(lst-ctn-kix_list_6-0, decimal) "." counter(lst-ctn-kix_list_6-1, decimal) "." counter(lst-ctn-kix_list_6-2, decimal) "." counter(lst-ctn-kix_list_6-3, decimal) "." counter(lst-ctn-kix_list_6-4, decimal) "." counter(lst-ctn-kix_list_6-5, decimal) " "
+ }
+
+ .lst-kix_list_17-4 > li {
+ counter-increment: lst-ctn-kix_list_17-4
+ }
+
+ ul.lst-kix_list_23-7 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_28-5 > li:before {
+ content: "\0025aa "
+ }
+
+ ul.lst-kix_list_23-8 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_25-0.start {
+ counter-reset: lst-ctn-kix_list_25-0 1
+ }
+
+ .lst-kix_list_34-7 > li:before {
+ content: "o "
+ }
+
+ ul.lst-kix_list_23-4 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_20-7 > li {
+ counter-increment: lst-ctn-kix_list_20-7
+ }
+
+ ul.lst-kix_list_23-3 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_23-6 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_14-3.start {
+ counter-reset: lst-ctn-kix_list_14-3 0
+ }
+
+ ul.lst-kix_list_23-5 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_14-6.start {
+ counter-reset: lst-ctn-kix_list_14-6 0
+ }
+
+ ul.lst-kix_list_23-0 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_17-6.start {
+ counter-reset: lst-ctn-kix_list_17-6 0
+ }
+
+ ul.lst-kix_list_23-2 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_23-1 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_49-5 > li:before {
+ content: "\0025aa "
+ }
+
+ .lst-kix_list_20-6 > li:before {
+ content: "" counter(lst-ctn-kix_list_20-0, decimal) "." counter(lst-ctn-kix_list_20-1, decimal) "." counter(lst-ctn-kix_list_20-2, decimal) "." counter(lst-ctn-kix_list_20-3, decimal) "." counter(lst-ctn-kix_list_20-4, decimal) "." counter(lst-ctn-kix_list_20-5, decimal) "." counter(lst-ctn-kix_list_20-6, decimal) " "
+ }
+
+ ol.lst-kix_list_10-0 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_9-0 > li:before {
+ content: "\002751 "
+ }
+
+ .lst-kix_list_49-4 > li:before {
+ content: "o "
+ }
+
+ .lst-kix_list_14-5 > li {
+ counter-increment: lst-ctn-kix_list_14-5
+ }
+
+ .lst-kix_list_7-0 > li:before {
+ content: "" counter(lst-ctn-kix_list_7-0, lower-latin) ". "
+ }
+
+ .lst-kix_list_19-6 > li {
+ counter-increment: lst-ctn-kix_list_19-6
+ }
+
+ .lst-kix_list_3-5 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_44-6 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_29-3 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_17-1 > li {
+ counter-increment: lst-ctn-kix_list_17-1
+ }
+
+ ol.lst-kix_list_7-0.start {
+ counter-reset: lst-ctn-kix_list_7-0 0
+ }
+
+ .lst-kix_list_19-3 > li:before {
+ content: "" counter(lst-ctn-kix_list_19-0, decimal) "." counter(lst-ctn-kix_list_19-1, decimal) "." counter(lst-ctn-kix_list_19-2, decimal) "." counter(lst-ctn-kix_list_19-3, decimal) " "
+ }
+
+ .lst-kix_list_19-3 > li {
+ counter-increment: lst-ctn-kix_list_19-3
+ }
+
+ .lst-kix_list_10-0 > li {
+ counter-increment: lst-ctn-kix_list_10-0
+ }
+
+ .lst-kix_list_4-6 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_17-8 > li:before {
+ content: "" counter(lst-ctn-kix_list_17-0, decimal) "." counter(lst-ctn-kix_list_17-1, decimal) "." counter(lst-ctn-kix_list_17-2, decimal) "." counter(lst-ctn-kix_list_17-3, decimal) "." counter(lst-ctn-kix_list_17-4, decimal) "." counter(lst-ctn-kix_list_17-5, decimal) "." counter(lst-ctn-kix_list_17-6, decimal) "." counter(lst-ctn-kix_list_17-7, decimal) "." counter(lst-ctn-kix_list_17-8, decimal) " "
+ }
+
+ ol.lst-kix_list_6-4 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_6-5 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_16-3 > li {
+ counter-increment: lst-ctn-kix_list_16-3
+ }
+
+ ol.lst-kix_list_6-2 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_20-2 > li {
+ counter-increment: lst-ctn-kix_list_20-2
+ }
+
+ ol.lst-kix_list_6-3 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_20-1 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_6-8 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_20-0 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_20-3 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_6-6 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_20-2 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_12-5 > li:before {
+ content: "\0025cf "
+ }
+
+ ol.lst-kix_list_6-7 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_20-4 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_20-5 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_3-0 > li:before {
+ content: "\0025cf "
+ }
+
+ ol.lst-kix_list_20-6 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_20-7 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_20-8 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_12-2 > li:before {
+ content: "\0025cf "
+ }
+
+ ol.lst-kix_list_6-1 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_19-7 > li:before {
+ content: "" counter(lst-ctn-kix_list_19-0, decimal) "." counter(lst-ctn-kix_list_19-1, decimal) "." counter(lst-ctn-kix_list_19-2, decimal) "." counter(lst-ctn-kix_list_19-3, decimal) "." counter(lst-ctn-kix_list_19-4, decimal) "." counter(lst-ctn-kix_list_19-5, decimal) "." counter(lst-ctn-kix_list_19-6, decimal) "." counter(lst-ctn-kix_list_19-7, decimal) " "
+ }
+
+ ol.lst-kix_list_6-0 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_5-4 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_32-3 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_33-7 > li:before {
+ content: "o "
+ }
+
+ ol.lst-kix_list_6-6.start {
+ counter-reset: lst-ctn-kix_list_6-6 0
+ }
+
+ ol.lst-kix_list_42-0.start {
+ counter-reset: lst-ctn-kix_list_42-0 0
+ }
+
+ ol.lst-kix_list_42-5.start {
+ counter-reset: lst-ctn-kix_list_42-5 0
+ }
+
+ .lst-kix_list_6-5 > li {
+ counter-increment: lst-ctn-kix_list_6-5
+ }
+
+ ol.lst-kix_list_14-2.start {
+ counter-reset: lst-ctn-kix_list_14-2 0
+ }
+
+ ol.lst-kix_list_18-7.start {
+ counter-reset: lst-ctn-kix_list_18-7 0
+ }
+
+ ol.lst-kix_list_17-2 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_17-3 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_17-0 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_17-1 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_17-6 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_17-7 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_17-4 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_17-5 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_25-1 > li {
+ counter-increment: lst-ctn-kix_list_25-1
+ }
+
+ .lst-kix_list_10-8 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_35-3 > li:before {
+ content: "\0025cf "
+ }
+
+ ol.lst-kix_list_17-8 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_6-2 > li {
+ counter-increment: lst-ctn-kix_list_6-2
+ }
+
+ .lst-kix_list_13-5 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_13-0 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_34-1 > li:before {
+ content: "o "
+ }
+
+ .lst-kix_list_44-4 > li:before {
+ content: "o "
+ }
+
+ ol.lst-kix_list_21-3.start {
+ counter-reset: lst-ctn-kix_list_21-3 0
+ }
+
+ .lst-kix_list_19-2 > li {
+ counter-increment: lst-ctn-kix_list_19-2
+ }
+
+ .lst-kix_list_6-7 > li {
+ counter-increment: lst-ctn-kix_list_6-7
+ }
+
+ .lst-kix_list_45-7 > li:before {
+ content: "o "
+ }
+
+ ol.lst-kix_list_14-4.start {
+ counter-reset: lst-ctn-kix_list_14-4 0
+ }
+
+ .lst-kix_list_43-3 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_42-5 > li {
+ counter-increment: lst-ctn-kix_list_42-5
+ }
+
+ .lst-kix_list_32-5 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_32-6 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_15-5 > li:before {
+ content: "" counter(lst-ctn-kix_list_15-0, decimal) "." counter(lst-ctn-kix_list_15-1, decimal) "." counter(lst-ctn-kix_list_15-2, decimal) "." counter(lst-ctn-kix_list_15-3, decimal) "." counter(lst-ctn-kix_list_15-4, decimal) "." counter(lst-ctn-kix_list_15-5, decimal) " "
+ }
+
+ .lst-kix_list_6-3 > li:before {
+ content: "" counter(lst-ctn-kix_list_6-0, decimal) "." counter(lst-ctn-kix_list_6-1, decimal) "." counter(lst-ctn-kix_list_6-2, decimal) "." counter(lst-ctn-kix_list_6-3, decimal) " "
+ }
+
+ .lst-kix_list_44-8 > li:before {
+ content: "\0025aa "
+ }
+
+ .lst-kix_list_11-3 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_37-0 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_20-4 > li {
+ counter-increment: lst-ctn-kix_list_20-4
+ }
+
+ ol.lst-kix_list_17-5.start {
+ counter-reset: lst-ctn-kix_list_17-5 0
+ }
+
+ .lst-kix_list_31-6 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_24-8 > li:before {
+ content: "\0025cf "
+ }
+
+ ol.lst-kix_list_15-4.start {
+ counter-reset: lst-ctn-kix_list_15-4 0
+ }
+
+ .lst-kix_list_27-2 > li:before {
+ content: "\0025aa "
+ }
+
+ .lst-kix_list_45-1 > li:before {
+ content: "o "
+ }
+
+ .lst-kix_list_37-7 > li:before {
+ content: "o "
+ }
+
+ .lst-kix_list_3-6 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_41-6 > li:before {
+ content: "\0025cf "
+ }
+
+ ol.lst-kix_list_16-3.start {
+ counter-reset: lst-ctn-kix_list_16-3 0
+ }
+
+ .lst-kix_list_22-0 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_26-3 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_38-5 > li:before {
+ content: "\0025aa "
+ }
+
+ .lst-kix_list_34-5 > li:before {
+ content: "\0025aa "
+ }
+
+ ol.lst-kix_list_42-8 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_42-7 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_42-6 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_42-5 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_42-4 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_42-2 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_42-3 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_42-0 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_42-1 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_5-5 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_19-7 > li {
+ counter-increment: lst-ctn-kix_list_19-7
+ }
+
+ .lst-kix_list_18-5 > li {
+ counter-increment: lst-ctn-kix_list_18-5
+ }
+
+ ol.lst-kix_list_17-0.start {
+ counter-reset: lst-ctn-kix_list_17-0 1
+ }
+
+ .lst-kix_list_39-4 > li:before {
+ content: "o "
+ }
+
+ .lst-kix_list_9-2 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_42-3 > li {
+ counter-increment: lst-ctn-kix_list_42-3
+ }
+
+ .lst-kix_list_15-8 > li {
+ counter-increment: lst-ctn-kix_list_15-8
+ }
+
+ ul.lst-kix_list_28-2 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_16-1 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_28-3 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_16-2 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_28-4 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_16-3 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_28-5 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_28-1 > li:before {
+ content: "o "
+ }
+
+ ol.lst-kix_list_16-4 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_44-1 > li:before {
+ content: "o "
+ }
+
+ ul.lst-kix_list_28-6 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_28-7 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_28-8 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_20-4 > li:before {
+ content: "" counter(lst-ctn-kix_list_20-0, decimal) "." counter(lst-ctn-kix_list_20-1, decimal) "." counter(lst-ctn-kix_list_20-2, decimal) "." counter(lst-ctn-kix_list_20-3, decimal) "." counter(lst-ctn-kix_list_20-4, decimal) " "
+ }
+
+ ol.lst-kix_list_16-0 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_41-4 > li:before {
+ content: "o "
+ }
+
+ .lst-kix_list_32-1 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_31-8 > li:before {
+ content: "\0025aa "
+ }
+
+ ol.lst-kix_list_16-5 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_42-5 > li:before {
+ content: "" counter(lst-ctn-kix_list_42-5, lower-roman) ". "
+ }
+
+ .lst-kix_list_28-2 > li:before {
+ content: "\0025aa "
+ }
+
+ ol.lst-kix_list_16-6 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_16-7 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_16-8 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_38-0 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_30-1 > li:before {
+ content: "o "
+ }
+
+ .lst-kix_list_5-8 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_14-5 > li:before {
+ content: "" counter(lst-ctn-kix_list_14-0, decimal) "." counter(lst-ctn-kix_list_14-1, decimal) "." counter(lst-ctn-kix_list_14-2, decimal) "." counter(lst-ctn-kix_list_14-3, decimal) "." counter(lst-ctn-kix_list_14-4, decimal) "." counter(lst-ctn-kix_list_14-5, decimal) " "
+ }
+
+ .lst-kix_list_40-1 > li:before {
+ content: "o "
+ }
+
+ ol.lst-kix_list_19-8.start {
+ counter-reset: lst-ctn-kix_list_19-8 0
+ }
+
+ ul.lst-kix_list_28-1 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_42-3 > li:before {
+ content: "" counter(lst-ctn-kix_list_42-3, decimal) ". "
+ }
+
+ ul.lst-kix_list_28-0 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_22-6 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_22-7 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_22-4 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_22-5 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_22-2 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_22-3 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_22-0 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_42-8 > li {
+ counter-increment: lst-ctn-kix_list_42-8
+ }
+
+ ol.lst-kix_list_42-8.start {
+ counter-reset: lst-ctn-kix_list_42-8 0
+ }
+
+ ul.lst-kix_list_22-1 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_43-8 > li:before {
+ content: "\0025aa "
+ }
+
+ .lst-kix_list_21-1 > li:before {
+ content: "" counter(lst-ctn-kix_list_21-0, decimal) "." counter(lst-ctn-kix_list_21-1, decimal) " "
+ }
+
+ .lst-kix_list_15-3 > li:before {
+ content: "" counter(lst-ctn-kix_list_15-0, decimal) "." counter(lst-ctn-kix_list_15-1, decimal) "." counter(lst-ctn-kix_list_15-2, decimal) "." counter(lst-ctn-kix_list_15-3, decimal) " "
+ }
+
+ .lst-kix_list_39-5 > li:before {
+ content: "\0025aa "
+ }
+
+ .lst-kix_list_11-8 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_6-0 > li:before {
+ content: "" counter(lst-ctn-kix_list_6-0, decimal) " "
+ }
+
+ .lst-kix_list_40-3 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_15-2 > li {
+ counter-increment: lst-ctn-kix_list_15-2
+ }
+
+ .lst-kix_list_28-4 > li:before {
+ content: "o "
+ }
+
+ ul.lst-kix_list_22-8 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_24-6 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_45-8 > li:before {
+ content: "\0025aa "
+ }
+
+ .lst-kix_list_42-0 > li {
+ counter-increment: lst-ctn-kix_list_42-0
+ }
+
+ .lst-kix_list_46-2 > li:before {
+ content: "\0025aa "
+ }
+
+ ol.lst-kix_list_20-1.start {
+ counter-reset: lst-ctn-kix_list_20-1 6
+ }
+
+ .lst-kix_list_29-1 > li:before {
+ content: "o "
+ }
+
+ .lst-kix_list_46-5 > li:before {
+ content: "\0025aa "
+ }
+
+ .lst-kix_list_8-7 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_1-7 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_35-5 > li:before {
+ content: "\0025aa "
+ }
+
+ .lst-kix_list_28-8 > li:before {
+ content: "\0025aa "
+ }
+
+ .lst-kix_list_33-1 > li:before {
+ content: "o "
+ }
+
+ .lst-kix_list_15-0 > li {
+ counter-increment: lst-ctn-kix_list_15-0
+ }
+
+ .lst-kix_list_20-1 > li {
+ counter-increment: lst-ctn-kix_list_20-1
+ }
+
+ .lst-kix_list_7-3 > li:before {
+ content: "\0025cf "
+ }
+
+ ul.lst-kix_list_12-8 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_30-5 > li:before {
+ content: "\0025aa "
+ }
+
+ ul.lst-kix_list_12-7 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_1-2 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_22-3 > li:before {
+ content: "\0025cf "
+ }
+
+ ul.lst-kix_list_12-0 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_12-1 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_6-0.start {
+ counter-reset: lst-ctn-kix_list_6-0 1
+ }
+
+ ul.lst-kix_list_12-2 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_12-3 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_19-0 > li:before {
+ content: "" counter(lst-ctn-kix_list_19-0, decimal) " "
+ }
+
+ ul.lst-kix_list_12-4 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_12-5 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_25-2 > li {
+ counter-increment: lst-ctn-kix_list_25-2
+ }
+
+ ul.lst-kix_list_12-6 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_49-3 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_12-3 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_38-6 > li:before {
+ content: "\0025cf "
+ }
+
+ ol.lst-kix_list_21-0.start {
+ counter-reset: lst-ctn-kix_list_21-0 0
+ }
+
+ ul.lst-kix_list_33-8 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_43-0 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_48-7 > li:before {
+ content: "o "
+ }
+
+ .lst-kix_list_14-4 > li {
+ counter-increment: lst-ctn-kix_list_14-4
+ }
+
+ .lst-kix_list_27-7 > li:before {
+ content: "o "
+ }
+
+ .lst-kix_list_2-7 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_17-7 > li {
+ counter-increment: lst-ctn-kix_list_17-7
+ }
+
+ ul.lst-kix_list_33-0 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_25-0 > li:before {
+ content: "" counter(lst-ctn-kix_list_25-0, decimal) " "
+ }
+
+ ul.lst-kix_list_33-1 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_33-2 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_33-3 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_42-7.start {
+ counter-reset: lst-ctn-kix_list_42-7 0
+ }
+
+ ul.lst-kix_list_33-4 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_18-2 > li {
+ counter-increment: lst-ctn-kix_list_18-2
+ }
+
+ ul.lst-kix_list_33-5 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_14-8 > li:before {
+ content: "" counter(lst-ctn-kix_list_14-0, decimal) "." counter(lst-ctn-kix_list_14-1, decimal) "." counter(lst-ctn-kix_list_14-2, decimal) "." counter(lst-ctn-kix_list_14-3, decimal) "." counter(lst-ctn-kix_list_14-4, decimal) "." counter(lst-ctn-kix_list_14-5, decimal) "." counter(lst-ctn-kix_list_14-6, decimal) "." counter(lst-ctn-kix_list_14-7, decimal) "." counter(lst-ctn-kix_list_14-8, decimal) " "
+ }
+
+ ul.lst-kix_list_33-6 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_33-7 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_27-4 > li:before {
+ content: "o "
+ }
+
+ ul.lst-kix_list_41-2 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_41-1 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_41-0 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_41-6 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_41-5 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_19-6.start {
+ counter-reset: lst-ctn-kix_list_19-6 0
+ }
+
+ ul.lst-kix_list_41-4 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_41-3 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_18-8 > li:before {
+ content: "" counter(lst-ctn-kix_list_18-0, decimal) "." counter(lst-ctn-kix_list_18-1, decimal) "." counter(lst-ctn-kix_list_18-2, decimal) "." counter(lst-ctn-kix_list_18-3, decimal) "." counter(lst-ctn-kix_list_18-4, decimal) "." counter(lst-ctn-kix_list_18-5, decimal) "." counter(lst-ctn-kix_list_18-6, decimal) "." counter(lst-ctn-kix_list_18-7, decimal) "." counter(lst-ctn-kix_list_18-8, decimal) " "
+ }
+
+ .lst-kix_list_21-2 > li:before {
+ content: "" counter(lst-ctn-kix_list_21-0, decimal) "." counter(lst-ctn-kix_list_21-1, decimal) "." counter(lst-ctn-kix_list_21-2, decimal) " "
+ }
+
+ ul.lst-kix_list_41-8 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_41-7 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_14-4 > li:before {
+ content: "" counter(lst-ctn-kix_list_14-0, decimal) "." counter(lst-ctn-kix_list_14-1, decimal) "." counter(lst-ctn-kix_list_14-2, decimal) "." counter(lst-ctn-kix_list_14-3, decimal) "." counter(lst-ctn-kix_list_14-4, decimal) " "
+ }
+
+ ol.lst-kix_list_21-1.start {
+ counter-reset: lst-ctn-kix_list_21-1 6
+ }
+
+ .lst-kix_list_30-3 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_26-4 > li:before {
+ content: "o "
+ }
+
+ .lst-kix_list_6-1 > li {
+ counter-increment: lst-ctn-kix_list_6-1
+ }
+
+ .lst-kix_list_34-2 > li:before {
+ content: "\0025aa "
+ }
+
+ ul.lst-kix_list_45-8 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_43-2 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_4-7 > li:before {
+ content: "\0025cf "
+ }
+
+ ul.lst-kix_list_45-7 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_43-1 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_43-4 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_43-3 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_43-6 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_43-5 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_43-8 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_14-6 > li {
+ counter-increment: lst-ctn-kix_list_14-6
+ }
+
+ ul.lst-kix_list_43-7 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_18-4 > li {
+ counter-increment: lst-ctn-kix_list_18-4
+ }
+
+ .lst-kix_list_37-8 > li:before {
+ content: "\0025aa "
+ }
+
+ .lst-kix_list_16-4 > li:before {
+ content: "" counter(lst-ctn-kix_list_16-0, decimal) "." counter(lst-ctn-kix_list_16-1, decimal) "." counter(lst-ctn-kix_list_16-2, decimal) "." counter(lst-ctn-kix_list_16-3, decimal) "." counter(lst-ctn-kix_list_16-4, decimal) " "
+ }
+
+ ul.lst-kix_list_43-0 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_43-4 > li:before {
+ content: "o "
+ }
+
+ .lst-kix_list_17-3 > li {
+ counter-increment: lst-ctn-kix_list_17-3
+ }
+
+ .lst-kix_list_49-1 > li:before {
+ content: "o "
+ }
+
+ ul.lst-kix_list_45-0 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_45-1 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_23-8 > li:before {
+ content: "\0025cf "
+ }
+
+ ul.lst-kix_list_45-2 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_45-3 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_45-4 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_45-5 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_17-1 > li:before {
+ content: "" counter(lst-ctn-kix_list_17-0, decimal) "." counter(lst-ctn-kix_list_17-1, decimal) " "
+ }
+
+ ul.lst-kix_list_45-6 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_6-6 > li:before {
+ content: "" counter(lst-ctn-kix_list_6-0, decimal) "." counter(lst-ctn-kix_list_6-1, decimal) "." counter(lst-ctn-kix_list_6-2, decimal) "." counter(lst-ctn-kix_list_6-3, decimal) "." counter(lst-ctn-kix_list_6-4, decimal) "." counter(lst-ctn-kix_list_6-5, decimal) "." counter(lst-ctn-kix_list_6-6, decimal) " "
+ }
+
+ .lst-kix_list_42-8 > li:before {
+ content: "" counter(lst-ctn-kix_list_42-8, lower-roman) ". "
+ }
+
+ .lst-kix_list_21-5 > li {
+ counter-increment: lst-ctn-kix_list_21-5
+ }
+
+ .lst-kix_list_16-6 > li:before {
+ content: "" counter(lst-ctn-kix_list_16-0, decimal) "." counter(lst-ctn-kix_list_16-1, decimal) "." counter(lst-ctn-kix_list_16-2, decimal) "." counter(lst-ctn-kix_list_16-3, decimal) "." counter(lst-ctn-kix_list_16-4, decimal) "." counter(lst-ctn-kix_list_16-5, decimal) "." counter(lst-ctn-kix_list_16-6, decimal) " "
+ }
+
+ .lst-kix_list_43-6 > li:before {
+ content: "\0025cf "
+ }
+
+ ol.lst-kix_list_16-7.start {
+ counter-reset: lst-ctn-kix_list_16-7 0
+ }
+
+ ul.lst-kix_list_48-1 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_18-4.start {
+ counter-reset: lst-ctn-kix_list_18-4 0
+ }
+
+ ul.lst-kix_list_48-0 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_48-3 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_48-2 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_46-7 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_46-6 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_14-8 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_46-8 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_14-7 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_21-4.start {
+ counter-reset: lst-ctn-kix_list_21-4 0
+ }
+
+ ol.lst-kix_list_14-6 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_14-5 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_14-4 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_5-3 > li:before {
+ content: "\0025cf "
+ }
+
+ ol.lst-kix_list_14-3 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_14-2 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_14-1 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_14-0 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_11-0 > li:before {
+ content: "" counter(lst-ctn-kix_list_11-0, decimal) ". "
+ }
+
+ ul.lst-kix_list_46-2 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_48-8 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_46-3 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_46-4 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_46-5 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_48-4 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_48-5 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_46-0 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_48-6 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_46-1 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_48-7 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_19-4 > li {
+ counter-increment: lst-ctn-kix_list_19-4
+ }
+
+ .lst-kix_list_47-4 > li:before {
+ content: "o "
+ }
+
+ .lst-kix_list_16-2 > li {
+ counter-increment: lst-ctn-kix_list_16-2
+ }
+
+ .lst-kix_list_20-6 > li {
+ counter-increment: lst-ctn-kix_list_20-6
+ }
+
+ .lst-kix_list_8-0 > li {
+ counter-increment: lst-ctn-kix_list_8-0
+ }
+
+ ul.lst-kix_list_4-8 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_4-7 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_4-6 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_17-2 > li:before {
+ content: "" counter(lst-ctn-kix_list_17-0, decimal) "." counter(lst-ctn-kix_list_17-1, decimal) "." counter(lst-ctn-kix_list_17-2, decimal) " "
+ }
+
+ .lst-kix_list_11-4 > li:before {
+ content: "\0025cf "
+ }
+
+ ul.lst-kix_list_4-1 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_48-8 > li:before {
+ content: "\0025aa "
+ }
+
+ ul.lst-kix_list_4-0 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_7-5 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_46-3 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_10-4 > li:before {
+ content: "\0025cf "
+ }
+
+ ul.lst-kix_list_4-5 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_4-4 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_25-6 > li {
+ counter-increment: lst-ctn-kix_list_25-6
+ }
+
+ ul.lst-kix_list_4-3 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_4-2 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_27-1 > li:before {
+ content: "o "
+ }
+
+ .lst-kix_list_25-7 > li {
+ counter-increment: lst-ctn-kix_list_25-7
+ }
+
+ .lst-kix_list_26-8 > li:before {
+ content: "\0025aa "
+ }
+
+ .lst-kix_list_49-6 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_30-7 > li:before {
+ content: "o "
+ }
+
+ ol.lst-kix_list_18-6.start {
+ counter-reset: lst-ctn-kix_list_18-6 0
+ }
+
+ .lst-kix_list_15-6 > li:before {
+ content: "" counter(lst-ctn-kix_list_15-0, decimal) "." counter(lst-ctn-kix_list_15-1, decimal) "." counter(lst-ctn-kix_list_15-2, decimal) "." counter(lst-ctn-kix_list_15-3, decimal) "." counter(lst-ctn-kix_list_15-4, decimal) "." counter(lst-ctn-kix_list_15-5, decimal) "." counter(lst-ctn-kix_list_15-6, decimal) " "
+ }
+
+ .lst-kix_list_18-4 > li:before {
+ content: "" counter(lst-ctn-kix_list_18-0, decimal) "." counter(lst-ctn-kix_list_18-1, decimal) "." counter(lst-ctn-kix_list_18-2, decimal) "." counter(lst-ctn-kix_list_18-3, decimal) "." counter(lst-ctn-kix_list_18-4, decimal) " "
+ }
+
+ .lst-kix_list_10-5 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_48-5 > li:before {
+ content: "\0025aa "
+ }
+
+ .lst-kix_list_17-2 > li {
+ counter-increment: lst-ctn-kix_list_17-2
+ }
+
+ ul.lst-kix_list_35-8 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_35-6 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_35-7 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_45-3 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_6-6 > li {
+ counter-increment: lst-ctn-kix_list_6-6
+ }
+
+ ul.lst-kix_list_35-5 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_35-4 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_35-3 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_35-2 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_17-3 > li:before {
+ content: "" counter(lst-ctn-kix_list_17-0, decimal) "." counter(lst-ctn-kix_list_17-1, decimal) "." counter(lst-ctn-kix_list_17-2, decimal) "." counter(lst-ctn-kix_list_17-3, decimal) " "
+ }
+
+ ul.lst-kix_list_35-1 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_35-0 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_15-2 > li:before {
+ content: "" counter(lst-ctn-kix_list_15-0, decimal) "." counter(lst-ctn-kix_list_15-1, decimal) "." counter(lst-ctn-kix_list_15-2, decimal) " "
+ }
+
+ .lst-kix_list_6-2 > li:before {
+ content: "" counter(lst-ctn-kix_list_6-0, decimal) "." counter(lst-ctn-kix_list_6-1, decimal) "." counter(lst-ctn-kix_list_6-2, decimal) " "
+ }
+
+ .lst-kix_list_19-1 > li:before {
+ content: "" counter(lst-ctn-kix_list_19-0, decimal) "." counter(lst-ctn-kix_list_19-1, decimal) " "
+ }
+
+ ul.lst-kix_list_39-0 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_39-1 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_6-3 > li {
+ counter-increment: lst-ctn-kix_list_6-3
+ }
+
+ ol.lst-kix_list_10-0.start {
+ counter-reset: lst-ctn-kix_list_10-0 0
+ }
+
+ .lst-kix_list_19-0 > li {
+ counter-increment: lst-ctn-kix_list_19-0
+ }
+
+ ol.lst-kix_list_6-4.start {
+ counter-reset: lst-ctn-kix_list_6-4 0
+ }
+
+ ul.lst-kix_list_39-7 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_16-0.start {
+ counter-reset: lst-ctn-kix_list_16-0 1
+ }
+
+ ul.lst-kix_list_39-6 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_39-8 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_25-4.start {
+ counter-reset: lst-ctn-kix_list_25-4 0
+ }
+
+ ul.lst-kix_list_39-3 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_39-2 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_15-4 > li {
+ counter-increment: lst-ctn-kix_list_15-4
+ }
+
+ ul.lst-kix_list_39-5 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_39-4 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_16-2.start {
+ counter-reset: lst-ctn-kix_list_16-2 0
+ }
+
+ ol.lst-kix_list_21-2.start {
+ counter-reset: lst-ctn-kix_list_21-2 0
+ }
+
+ .lst-kix_list_31-3 > li:before {
+ content: "\0025cf "
+ }
+
+ ol.lst-kix_list_14-1.start {
+ counter-reset: lst-ctn-kix_list_14-1 12
+ }
+
+ ol.lst-kix_list_18-1.start {
+ counter-reset: lst-ctn-kix_list_18-1 6
+ }
+
+ .lst-kix_list_28-3 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_8-4 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_47-1 > li:before {
+ content: "o "
+ }
+
+ .lst-kix_list_15-7 > li {
+ counter-increment: lst-ctn-kix_list_15-7
+ }
+
+ .lst-kix_list_26-7 > li:before {
+ content: "o "
+ }
+
+ .lst-kix_list_12-1 > li:before {
+ content: "\0025cf "
+ }
+
+ ol.lst-kix_list_14-8.start {
+ counter-reset: lst-ctn-kix_list_14-8 0
+ }
+
+ .lst-kix_list_31-4 > li:before {
+ content: "o "
+ }
+
+ .lst-kix_list_20-3 > li:before {
+ content: "" counter(lst-ctn-kix_list_20-0, decimal) "." counter(lst-ctn-kix_list_20-1, decimal) "." counter(lst-ctn-kix_list_20-2, decimal) "." counter(lst-ctn-kix_list_20-3, decimal) " "
+ }
+
+ .lst-kix_list_19-5 > li {
+ counter-increment: lst-ctn-kix_list_19-5
+ }
+
+ .lst-kix_list_49-2 > li:before {
+ content: "\0025aa "
+ }
+
+ .lst-kix_list_16-3 > li:before {
+ content: "" counter(lst-ctn-kix_list_16-0, decimal) "." counter(lst-ctn-kix_list_16-1, decimal) "." counter(lst-ctn-kix_list_16-2, decimal) "." counter(lst-ctn-kix_list_16-3, decimal) " "
+ }
+
+ .lst-kix_list_25-0 > li {
+ counter-increment: lst-ctn-kix_list_25-0
+ }
+
+ .lst-kix_list_34-4 > li:before {
+ content: "o "
+ }
+
+ .lst-kix_list_39-3 > li:before {
+ content: "\0025cf "
+ }
+
+ ol.lst-kix_list_8-0.start {
+ counter-reset: lst-ctn-kix_list_8-0 3
+ }
+
+ .lst-kix_list_4-2 > li:before {
+ content: "\0025cf "
+ }
+
+ ol.lst-kix_list_17-8.start {
+ counter-reset: lst-ctn-kix_list_17-8 0
+ }
+
+ .lst-kix_list_24-4 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_47-8 > li:before {
+ content: "\0025aa "
+ }
+
+ .lst-kix_list_42-1 > li:before {
+ content: "" counter(lst-ctn-kix_list_42-1, lower-latin) ". "
+ }
+
+ .lst-kix_list_17-6 > li:before {
+ content: "" counter(lst-ctn-kix_list_17-0, decimal) "." counter(lst-ctn-kix_list_17-1, decimal) "." counter(lst-ctn-kix_list_17-2, decimal) "." counter(lst-ctn-kix_list_17-3, decimal) "." counter(lst-ctn-kix_list_17-4, decimal) "." counter(lst-ctn-kix_list_17-5, decimal) "." counter(lst-ctn-kix_list_17-6, decimal) " "
+ }
+
+ .lst-kix_list_21-8 > li:before {
+ content: "" counter(lst-ctn-kix_list_21-0, decimal) "." counter(lst-ctn-kix_list_21-1, decimal) "." counter(lst-ctn-kix_list_21-2, decimal) "." counter(lst-ctn-kix_list_21-3, decimal) "." counter(lst-ctn-kix_list_21-4, decimal) "." counter(lst-ctn-kix_list_21-5, decimal) "." counter(lst-ctn-kix_list_21-6, decimal) "." counter(lst-ctn-kix_list_21-7, decimal) "." counter(lst-ctn-kix_list_21-8, decimal) " "
+ }
+
+ ol.lst-kix_list_42-4.start {
+ counter-reset: lst-ctn-kix_list_42-4 0
+ }
+
+ .lst-kix_list_31-5 > li:before {
+ content: "\0025aa "
+ }
+
+ .lst-kix_list_18-5 > li:before {
+ content: "" counter(lst-ctn-kix_list_18-0, decimal) "." counter(lst-ctn-kix_list_18-1, decimal) "." counter(lst-ctn-kix_list_18-2, decimal) "." counter(lst-ctn-kix_list_18-3, decimal) "." counter(lst-ctn-kix_list_18-4, decimal) "." counter(lst-ctn-kix_list_18-5, decimal) " "
+ }
+
+ .lst-kix_list_3-4 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_36-0 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_18-6 > li:before {
+ content: "" counter(lst-ctn-kix_list_18-0, decimal) "." counter(lst-ctn-kix_list_18-1, decimal) "." counter(lst-ctn-kix_list_18-2, decimal) "." counter(lst-ctn-kix_list_18-3, decimal) "." counter(lst-ctn-kix_list_18-4, decimal) "." counter(lst-ctn-kix_list_18-5, decimal) "." counter(lst-ctn-kix_list_18-6, decimal) " "
+ }
+
+ .lst-kix_list_27-0 > li:before {
+ content: "\0025cf "
+ }
+
+ ul.lst-kix_list_26-4 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_32-3 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_26-5 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_32-4 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_26-6 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_32-1 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_24-0 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_24-1 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_26-7 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_32-2 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_24-2 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_26-8 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_26-1 > li:before {
+ content: "o "
+ }
+
+ ul.lst-kix_list_32-7 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_24-3 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_32-8 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_24-4 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_49-7 > li:before {
+ content: "o "
+ }
+
+ ol.lst-kix_list_32-0 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_32-5 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_24-5 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_32-6 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_24-7 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_24-6 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_12-4 > li:before {
+ content: "\0025cf "
+ }
+
+ ul.lst-kix_list_24-8 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_26-1 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_43-1 > li:before {
+ content: "o "
+ }
+
+ ul.lst-kix_list_26-0 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_26-3 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_26-2 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_17-7.start {
+ counter-reset: lst-ctn-kix_list_17-7 0
+ }
+
+ .lst-kix_list_25-8 > li {
+ counter-increment: lst-ctn-kix_list_25-8
+ }
+
+ .lst-kix_list_11-1 > li:before {
+ content: "\0025cf "
+ }
+
+ ol.lst-kix_list_14-5.start {
+ counter-reset: lst-ctn-kix_list_14-5 0
+ }
+
+ .lst-kix_list_33-4 > li:before {
+ content: "o "
+ }
+
+ .lst-kix_list_46-1 > li:before {
+ content: "o "
+ }
+
+ .lst-kix_list_44-2 > li:before {
+ content: "\0025aa "
+ }
+
+ ol.lst-kix_list_19-0.start {
+ counter-reset: lst-ctn-kix_list_19-0 0
+ }
+
+ .lst-kix_list_17-4 > li:before {
+ content: "" counter(lst-ctn-kix_list_17-0, decimal) "." counter(lst-ctn-kix_list_17-1, decimal) "." counter(lst-ctn-kix_list_17-2, decimal) "." counter(lst-ctn-kix_list_17-3, decimal) "." counter(lst-ctn-kix_list_17-4, decimal) " "
+ }
+
+ .lst-kix_list_48-4 > li:before {
+ content: "o "
+ }
+
+ .lst-kix_list_47-3 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_14-3 > li {
+ counter-increment: lst-ctn-kix_list_14-3
+ }
+
+ .lst-kix_list_3-1 > li:before {
+ content: "\0025cf "
+ }
+
+ ul.lst-kix_list_2-4 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_19-2.start {
+ counter-reset: lst-ctn-kix_list_19-2 0
+ }
+
+ ul.lst-kix_list_2-5 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_2-6 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_2-7 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_2-0 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_45-2 > li:before {
+ content: "\0025aa "
+ }
+
+ .lst-kix_list_42-7 > li:before {
+ content: "" counter(lst-ctn-kix_list_42-7, lower-latin) ". "
+ }
+
+ ul.lst-kix_list_2-1 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_23-3 > li:before {
+ content: "\0025cf "
+ }
+
+ ul.lst-kix_list_2-2 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_2-3 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_18-0.start {
+ counter-reset: lst-ctn-kix_list_18-0 0
+ }
+
+ .lst-kix_list_15-3 > li {
+ counter-increment: lst-ctn-kix_list_15-3
+ }
+
+ .lst-kix_list_21-1 > li {
+ counter-increment: lst-ctn-kix_list_21-1
+ }
+
+ ul.lst-kix_list_2-8 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_9-7 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_23-2 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_22-6 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_15-0 > li:before {
+ content: "" counter(lst-ctn-kix_list_15-0, decimal) " "
+ }
+
+ .lst-kix_list_11-0 > li {
+ counter-increment: lst-ctn-kix_list_11-0
+ }
+
+ .lst-kix_list_3-2 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_24-0 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_7-0 > li {
+ counter-increment: lst-ctn-kix_list_7-0
+ }
+
+ .lst-kix_list_32-8 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_29-4 > li:before {
+ content: "o "
+ }
+
+ .lst-kix_list_36-7 > li:before {
+ content: "o "
+ }
+
+ .lst-kix_list_39-7 > li:before {
+ content: "o "
+ }
+
+ .lst-kix_list_17-5 > li:before {
+ content: "" counter(lst-ctn-kix_list_17-0, decimal) "." counter(lst-ctn-kix_list_17-1, decimal) "." counter(lst-ctn-kix_list_17-2, decimal) "." counter(lst-ctn-kix_list_17-3, decimal) "." counter(lst-ctn-kix_list_17-4, decimal) "." counter(lst-ctn-kix_list_17-5, decimal) " "
+ }
+
+ ul.lst-kix_list_10-7 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_10-8 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_10-5 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_39-1 > li:before {
+ content: "o "
+ }
+
+ .lst-kix_list_11-5 > li:before {
+ content: "\0025cf "
+ }
+
+ ul.lst-kix_list_10-6 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_11-2 > li:before {
+ content: "\0025cf "
+ }
+
+ ul.lst-kix_list_10-3 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_10-4 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_22-5 > li:before {
+ content: "\0025cf "
+ }
+
+ ul.lst-kix_list_10-1 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_1-4 > li:before {
+ content: "\0025cf "
+ }
+
+ ul.lst-kix_list_10-2 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_22-2 > li:before {
+ content: "\0025cf "
+ }
+
+ ol.lst-kix_list_25-4 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_25-3 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_48-0 > li:before {
+ content: "\0025cf "
+ }
+
+ ol.lst-kix_list_25-6 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_25-5 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_25-0 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_18-3 > li {
+ counter-increment: lst-ctn-kix_list_18-3
+ }
+
+ ol.lst-kix_list_25-2 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_25-1 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_16-4 > li {
+ counter-increment: lst-ctn-kix_list_16-4
+ }
+
+ ul.lst-kix_list_37-3 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_44-5 > li:before {
+ content: "\0025aa "
+ }
+
+ ul.lst-kix_list_37-2 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_37-1 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_37-0 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_17-4.start {
+ counter-reset: lst-ctn-kix_list_17-4 0
+ }
+
+ .lst-kix_list_20-3 > li {
+ counter-increment: lst-ctn-kix_list_20-3
+ }
+
+ ol.lst-kix_list_25-8 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_25-7 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_14-8 > li {
+ counter-increment: lst-ctn-kix_list_14-8
+ }
+
+ .lst-kix_list_46-0 > li:before {
+ content: "\0025cf "
+ }
+
+ ol.lst-kix_list_6-7.start {
+ counter-reset: lst-ctn-kix_list_6-7 0
+ }
+
+ ul.lst-kix_list_37-8 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_20-5 > li:before {
+ content: "" counter(lst-ctn-kix_list_20-0, decimal) "." counter(lst-ctn-kix_list_20-1, decimal) "." counter(lst-ctn-kix_list_20-2, decimal) "." counter(lst-ctn-kix_list_20-3, decimal) "." counter(lst-ctn-kix_list_20-4, decimal) "." counter(lst-ctn-kix_list_20-5, decimal) " "
+ }
+
+ ul.lst-kix_list_37-6 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_37-7 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_1-8 > li:before {
+ content: "\0025cf "
+ }
+
+ ul.lst-kix_list_37-4 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_37-5 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_15-5.start {
+ counter-reset: lst-ctn-kix_list_15-5 0
+ }
+
+ .lst-kix_list_3-3 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_20-5 > li {
+ counter-increment: lst-ctn-kix_list_20-5
+ }
+
+ .lst-kix_list_25-8 > li:before {
+ content: "" counter(lst-ctn-kix_list_25-0, decimal) "." counter(lst-ctn-kix_list_25-1, decimal) "." counter(lst-ctn-kix_list_25-2, decimal) "." counter(lst-ctn-kix_list_25-3, decimal) "." counter(lst-ctn-kix_list_25-4, decimal) "." counter(lst-ctn-kix_list_25-5, decimal) "." counter(lst-ctn-kix_list_25-6, decimal) "." counter(lst-ctn-kix_list_25-7, decimal) "." counter(lst-ctn-kix_list_25-8, decimal) " "
+ }
+
+ .lst-kix_list_25-5 > li {
+ counter-increment: lst-ctn-kix_list_25-5
+ }
+
+ ol.lst-kix_list_20-0.start {
+ counter-reset: lst-ctn-kix_list_20-0 0
+ }
+
+ ol.lst-kix_list_6-1.start {
+ counter-reset: lst-ctn-kix_list_6-1 3
+ }
+
+ .lst-kix_list_6-4 > li:before {
+ content: "" counter(lst-ctn-kix_list_6-0, decimal) "." counter(lst-ctn-kix_list_6-1, decimal) "." counter(lst-ctn-kix_list_6-2, decimal) "." counter(lst-ctn-kix_list_6-3, decimal) "." counter(lst-ctn-kix_list_6-4, decimal) " "
+ }
+
+ .lst-kix_list_18-7 > li:before {
+ content: "" counter(lst-ctn-kix_list_18-0, decimal) "." counter(lst-ctn-kix_list_18-1, decimal) "." counter(lst-ctn-kix_list_18-2, decimal) "." counter(lst-ctn-kix_list_18-3, decimal) "." counter(lst-ctn-kix_list_18-4, decimal) "." counter(lst-ctn-kix_list_18-5, decimal) "." counter(lst-ctn-kix_list_18-6, decimal) "." counter(lst-ctn-kix_list_18-7, decimal) " "
+ }
+
+ .lst-kix_list_14-2 > li {
+ counter-increment: lst-ctn-kix_list_14-2
+ }
+
+ ol.lst-kix_list_16-6.start {
+ counter-reset: lst-ctn-kix_list_16-6 0
+ }
+
+ .lst-kix_list_6-4 > li {
+ counter-increment: lst-ctn-kix_list_6-4
+ }
+
+ ol.lst-kix_list_6-8.start {
+ counter-reset: lst-ctn-kix_list_6-8 0
+ }
+
+ .lst-kix_list_18-6 > li {
+ counter-increment: lst-ctn-kix_list_18-6
+ }
+
+ .lst-kix_list_16-0 > li:before {
+ content: "" counter(lst-ctn-kix_list_16-0, decimal) " "
+ }
+
+ ol.lst-kix_list_21-7.start {
+ counter-reset: lst-ctn-kix_list_21-7 0
+ }
+
+ .lst-kix_list_23-4 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_16-5 > li:before {
+ content: "" counter(lst-ctn-kix_list_16-0, decimal) "." counter(lst-ctn-kix_list_16-1, decimal) "." counter(lst-ctn-kix_list_16-2, decimal) "." counter(lst-ctn-kix_list_16-3, decimal) "." counter(lst-ctn-kix_list_16-4, decimal) "." counter(lst-ctn-kix_list_16-5, decimal) " "
+ }
+
+ ol.lst-kix_list_18-2.start {
+ counter-reset: lst-ctn-kix_list_18-2 0
+ }
+
+ ol.lst-kix_list_21-8.start {
+ counter-reset: lst-ctn-kix_list_21-8 0
+ }
+
+ .lst-kix_list_14-0 > li {
+ counter-increment: lst-ctn-kix_list_14-0
+ }
+
+ .lst-kix_list_2-2 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_47-7 > li:before {
+ content: "o "
+ }
+
+ ol.lst-kix_list_25-8.start {
+ counter-reset: lst-ctn-kix_list_25-8 0
+ }
+
+ .lst-kix_list_7-7 > li:before {
+ content: "\0025cf "
+ }
+
+ ol.lst-kix_list_14-7.start {
+ counter-reset: lst-ctn-kix_list_14-7 0
+ }
+
+ .lst-kix_list_7-1 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_32-2 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_33-6 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_2-8 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_27-6 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_29-5 > li:before {
+ content: "\0025aa "
+ }
+
+ .lst-kix_list_21-6 > li:before {
+ content: "" counter(lst-ctn-kix_list_21-0, decimal) "." counter(lst-ctn-kix_list_21-1, decimal) "." counter(lst-ctn-kix_list_21-2, decimal) "." counter(lst-ctn-kix_list_21-3, decimal) "." counter(lst-ctn-kix_list_21-4, decimal) "." counter(lst-ctn-kix_list_21-5, decimal) "." counter(lst-ctn-kix_list_21-6, decimal) " "
+ }
+
+ .lst-kix_list_41-1 > li:before {
+ content: "o "
+ }
+
+ .lst-kix_list_27-5 > li:before {
+ content: "\0025aa "
+ }
+
+ .lst-kix_list_20-0 > li:before {
+ content: "" counter(lst-ctn-kix_list_20-0, decimal) " "
+ }
+
+ ol.lst-kix_list_20-2.start {
+ counter-reset: lst-ctn-kix_list_20-2 0
+ }
+
+ .lst-kix_list_27-8 > li:before {
+ content: "\0025aa "
+ }
+
+ .lst-kix_list_11-6 > li:before {
+ content: "\0025cf "
+ }
+
+ ul.lst-kix_list_8-4 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_8-5 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_8-2 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_8-3 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_8-8 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_8-6 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_42-4 > li:before {
+ content: "" counter(lst-ctn-kix_list_42-4, lower-latin) ". "
+ }
+
+ ul.lst-kix_list_8-7 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_4-5 > li:before {
+ content: "\0025cf "
+ }
+
+ ol.lst-kix_list_15-1.start {
+ counter-reset: lst-ctn-kix_list_15-1 2
+ }
+
+ ul.lst-kix_list_8-1 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_26-2 > li:before {
+ content: "\0025aa "
+ }
+
+ .lst-kix_list_37-3 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_2-5 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_7-6 > li:before {
+ content: "\0025cf "
+ }
+
+ ol.lst-kix_list_7-0 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_32-0.start {
+ counter-reset: lst-ctn-kix_list_32-0 0
+ }
+
+ .lst-kix_list_4-4 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_30-0 > li:before {
+ content: "\0025cf "
+ }
+
+ ul.lst-kix_list_30-4 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_30-3 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_30-6 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_30-5 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_30-8 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_35-8 > li:before {
+ content: "\0025aa "
+ }
+
+ ol.lst-kix_list_25-3.start {
+ counter-reset: lst-ctn-kix_list_25-3 0
+ }
+
+ ul.lst-kix_list_30-7 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_36-6 > li:before {
+ content: "\0025cf "
+ }
+
+ ul.lst-kix_list_30-0 {
+ list-style-type: none
+ }
+
+ ul.lst-kix_list_30-2 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_38-2 > li:before {
+ content: "\0025aa "
+ }
+
+ ul.lst-kix_list_30-1 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_5-0 > li:before {
+ content: "\0025cf "
+ }
+
+ ol.lst-kix_list_18-7 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_18-8 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_18-5 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_25-4 > li:before {
+ content: "" counter(lst-ctn-kix_list_25-0, decimal) "." counter(lst-ctn-kix_list_25-1, decimal) "." counter(lst-ctn-kix_list_25-2, decimal) "." counter(lst-ctn-kix_list_25-3, decimal) "." counter(lst-ctn-kix_list_25-4, decimal) " "
+ }
+
+ .lst-kix_list_14-2 > li:before {
+ content: "" counter(lst-ctn-kix_list_14-0, decimal) "." counter(lst-ctn-kix_list_14-1, decimal) "." counter(lst-ctn-kix_list_14-2, decimal) " "
+ }
+
+ ol.lst-kix_list_18-6 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_18-3 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_18-4 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_18-1 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_17-5 > li {
+ counter-increment: lst-ctn-kix_list_17-5
+ }
+
+ .lst-kix_list_15-4 > li:before {
+ content: "" counter(lst-ctn-kix_list_15-0, decimal) "." counter(lst-ctn-kix_list_15-1, decimal) "." counter(lst-ctn-kix_list_15-2, decimal) "." counter(lst-ctn-kix_list_15-3, decimal) "." counter(lst-ctn-kix_list_15-4, decimal) " "
+ }
+
+ ol.lst-kix_list_18-2 {
+ list-style-type: none
+ }
+
+ ol.lst-kix_list_18-0 {
+ list-style-type: none
+ }
+
+ .lst-kix_list_3-8 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_26-6 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_48-2 > li:before {
+ content: "\0025aa "
+ }
+
+ .lst-kix_list_21-7 > li {
+ counter-increment: lst-ctn-kix_list_21-7
+ }
+
+ .lst-kix_list_33-5 > li:before {
+ content: "\0025aa "
+ }
+
+ .lst-kix_list_5-6 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_16-8 > li {
+ counter-increment: lst-ctn-kix_list_16-8
+ }
+
+ .lst-kix_list_23-1 > li:before {
+ content: "\0025cf "
+ }
+
+ .lst-kix_list_25-4 > li {
+ counter-increment: lst-ctn-kix_list_25-4
+ }
+
+ .lst-kix_list_20-0 > li {
+ counter-increment: lst-ctn-kix_list_20-0
+ }
+
+ .lst-kix_list_24-7 > li:before {
+ content: "\0025cf "
+ }
+
+ ol {
+ margin: 0;
+ padding: 0
+ }
+
+ .c1 {
+ border-bottom-width: 1pt;
+ border-top-style: solid;
+ width: 193.2pt;
+ border-right-style: solid;
+ padding: 0pt 5.8pt 0pt 5.8pt;
+ border-bottom-color: #000000;
+ border-top-width: 1pt;
+ border-bottom-style: solid;
+ vertical-align: top;
+ border-top-color: #000000;
+ border-left-color: #000000;
+ border-right-color: #000000;
+ border-left-style: solid;
+ border-right-width: 1pt;
+ border-left-width: 1pt
+ }
+
+ .c20 {
+ border-bottom-width: 1pt;
+ border-top-style: solid;
+ width: 238.2pt;
+ border-right-style: solid;
+ padding: 0pt 5.8pt 0pt 5.8pt;
+ border-bottom-color: #000000;
+ border-top-width: 1pt;
+ border-bottom-style: solid;
+ vertical-align: top;
+ border-top-color: #000000;
+ border-left-color: #000000;
+ border-right-color: #000000;
+ border-left-style: solid;
+ border-right-width: 1pt;
+ border-left-width: 1pt
+ }
+
+ .c3 {
+ padding-left: 0pt;
+ line-height: 1.0;
+ padding-top: 0pt;
+ margin-left: 36pt;
+ padding-bottom: 0pt
+ }
+
+ .c12 {
+ vertical-align: baseline;
+ color: #000000;
+ font-style: normal;
+ text-decoration: none
+ }
+
+ .c4 {
+ line-height: 1.0;
+ padding-top: 0pt;
+ text-align: left;
+ padding-bottom: 0pt
+ }
+
+ .c11 {
+ max-width: 432pt;
+ background-color: #ffffff;
+ padding: 72pt 90pt 72pt 90pt
+ }
+
+ .c2 {
+ widows: 2;
+ orphans: 2;
+ direction: ltr
+ }
+
+ .c16 {
+ margin-right: auto;
+ border-collapse: collapse;
+ margin-left: -5.8pt
+ }
+
+ .c9 {
+ line-height: 1.0;
+ padding-top: 36pt;
+ padding-bottom: 0pt
+ }
+
+ .c21 {
+ line-height: 1.0;
+ padding-top: 0pt;
+ padding-bottom: 36pt
+ }
+
+ .c15 {
+ font-size: 14pt;
+ font-family: "Calibri"
+ }
+
+ .c18 {
+ font-size: 12pt;
+ font-family: "Times New Roman"
+ }
+
+ .c6 {
+ margin: 0;
+ padding: 0
+ }
+
+ .c0 {
+ font-size: 12pt;
+ font-family: "Calibri"
+ }
+
+ .c22 {
+ font-size: 10pt;
+ font-family: "Times New Roman"
+ }
+
+ .c13 {
+ color: #000000;
+ background-color: #ffff00
+ }
+
+ .c14 {
+ font-size: 9pt;
+ font-family: "Times New Roman"
+ }
+
+ .c10 {
+ text-decoration: underline
+ }
+
+ .c17 {
+ color: #ff0000
+ }
+
+ .c7 {
+ font-weight: bold
+ }
+
+ .c19 {
+ height: 0pt
+ }
+
+ .c8 {
+ font-weight: normal
+ }
+
+ .c5 {
+ height: 10pt
+ }
+
+ .title {
+ widows: 2;
+ padding-top: 0pt;
+ line-height: 1.0;
+ orphans: 2;
+ text-align: center;
+ color: #000000;
+ font-size: 14pt;
+ font-family: "Times New Roman";
+ font-weight: bold;
+ padding-bottom: 0pt;
+ page-break-after: avoid
+ }
+
+ .subtitle {
+ widows: 2;
+ padding-top: 18pt;
+ line-height: 1.0;
+ orphans: 2;
+ text-align: left;
+ color: #666666;
+ font-style: italic;
+ font-size: 24pt;
+ font-family: "Georgia";
+ padding-bottom: 4pt;
+ page-break-after: avoid
+ }
+
+ li {
+ color: #000000;
+ font-size: 10pt;
+ font-family: "Times New Roman"
+ }
+
+ p {
+ color: #000000;
+ font-size: 10pt;
+ margin: 0;
+ font-family: "Times New Roman"
+ }
+
+ h1 {
+ widows: 2;
+ padding-top: 0pt;
+ line-height: 1.0;
+ orphans: 2;
+ text-align: center;
+ color: #000000;
+ font-size: 12pt;
+ font-family: "Times New Roman";
+ font-weight: bold;
+ padding-bottom: 0pt;
+ page-break-after: avoid
+ }
+
+ h2 {
+ widows: 2;
+ padding-top: 0pt;
+ line-height: 1.0;
+ orphans: 2;
+ text-align: left;
+ color: #000000;
+ font-size: 10pt;
+ font-family: "Times New Roman";
+ font-weight: bold;
+ padding-bottom: 0pt;
+ page-break-after: avoid
+ }
+
+ h3 {
+ widows: 2;
+ padding-top: 0pt;
+ line-height: 1.0;
+ orphans: 2;
+ text-align: left;
+ color: #000000;
+ font-size: 10pt;
+ text-decoration: underline;
+ font-family: "Times New Roman";
+ padding-bottom: 0pt;
+ page-break-after: avoid
+ }
+
+ h4 {
+ widows: 2;
+ padding-top: 12pt;
+ line-height: 1.0;
+ orphans: 2;
+ text-align: left;
+ color: #000000;
+ font-size: 12pt;
+ font-family: "Times New Roman";
+ font-weight: bold;
+ padding-bottom: 2pt;
+ page-break-after: avoid
+ }
+
+ h5 {
+ widows: 2;
+ padding-top: 11pt;
+ line-height: 1.0;
+ orphans: 2;
+ text-align: left;
+ color: #000000;
+ font-size: 11pt;
+ font-family: "Times New Roman";
+ font-weight: bold;
+ padding-bottom: 2pt;
+ page-break-after: avoid
+ }
+
+ h6 {
+ widows: 2;
+ padding-top: 10pt;
+ line-height: 1.0;
+ orphans: 2;
+ text-align: left;
+ color: #000000;
+ font-size: 10pt;
+ font-family: "Times New Roman";
+ font-weight: bold;
+ padding-bottom: 2pt;
+ page-break-after: avoid
+ }
+}
\ No newline at end of file
diff --git a/web/app/assets/stylesheets/minimal/minimal.css.scss b/web/app/assets/stylesheets/minimal/minimal.css.scss
index 9ec8c234a..f97d05c7f 100644
--- a/web/app/assets/stylesheets/minimal/minimal.css.scss
+++ b/web/app/assets/stylesheets/minimal/minimal.css.scss
@@ -1,4 +1,5 @@
/**
+*= require web/Raleway
*= require client/ie
*= require client/jamkazam
*= require client/screen_common
diff --git a/web/app/assets/stylesheets/web/Raleway.css b/web/app/assets/stylesheets/web/Raleway.css
new file mode 100644
index 000000000..14c53019b
--- /dev/null
+++ b/web/app/assets/stylesheets/web/Raleway.css
@@ -0,0 +1,36 @@
+@font-face {
+ font-family: 'Raleway';
+ font-style: normal;
+ font-weight: 100;
+ src: local('Raleway Thin'), local('Raleway-Thin'), url(/assets/Raleway/Raleway-Thin.ttf) format('truetype'), url(/assets/Raleway/Raleway-Thin.woff2) format('woff2'), url(/assets/Raleway/Raleway-Thin.woff) format('woff');
+}
+
+@font-face {
+ font-family: 'Raleway';
+ font-style: normal;
+ font-weight: 300;
+ src: local('Raleway Light'), local('Raleway-Light'), url(/assets/Raleway/Raleway-Light.ttf) format('truetype'), url(/assets/Raleway/Raleway-Light.woff2) format('woff2'), url(/assets/Raleway/Raleway-Light.woff) format('woff');
+}
+
+@font-face {
+ font-family: 'Raleway';
+ font-style: normal;
+ font-weight: 400;
+ src: url(/assets/Raleway/Raleway.eot);
+ src: local('Raleway'), url(/assets/Raleway/Raleway.eot?#iefix) format('embedded-opentype'), url(/assets/Raleway/Raleway.svg#Raleway) format('svg'), url(/assets/Raleway/Raleway.ttf) format('truetype'), url(/assets/Raleway/Raleway.woff2) format('woff2'), url(/assets/Raleway/Raleway.woff) format('woff');
+}
+
+@font-face {
+ font-family: 'Raleway';
+ font-style: normal;
+ font-weight: 700;
+ src: local('Raleway Bold'), local('Raleway-Bold'), url(/assets/Raleway/Raleway-Bold.ttf) format('truetype'), url(/assets/Raleway/Raleway-Bold.woff2) format('woff2'), url(/assets/Raleway/Raleway-Bold.woff) format('woff');
+}
+
+@font-face {
+ font-family: 'Raleway';
+ font-style: normal;
+ font-weight: 900;
+ src: local('Raleway Heavy'), local('Raleway-Heavy'), url(/assets/Raleway/Raleway-Heavy.ttf) format('truetype'), url(/assets/Raleway/Raleway-Heavy.woff2) format('woff2'), url(/assets/Raleway/Raleway-Heavy.woff) format('woff');
+}
+
diff --git a/web/app/assets/stylesheets/web/affiliate_links.css.scss b/web/app/assets/stylesheets/web/affiliate_links.css.scss
new file mode 100644
index 000000000..b788146b5
--- /dev/null
+++ b/web/app/assets/stylesheets/web/affiliate_links.css.scss
@@ -0,0 +1,65 @@
+@import 'client/common.css.scss';
+
+body.affiliate_links {
+
+ h2 {
+ color:white !important;
+ }
+
+ h2, h3 {
+ margin-bottom:2px;
+ }
+
+ .intro {
+ margin-bottom:30px;
+ }
+
+ .link-type-prompt {
+ color:$ColorTextTypical;
+ line-height:125%;
+
+
+ p {
+ margin-bottom:20px;
+ }
+
+ .example-link {
+ font-weight:bold;
+ }
+
+ }
+
+ table.links-table {
+ min-width:100%;
+ margin-top:20px;
+ margin-bottom:30px;
+
+ th {
+ padding: 10px 0 20px;
+ white-space:nowrap;
+ }
+
+ td {
+ padding:3px 0;
+ white-space:nowrap;
+ }
+ .target {
+ width:45%;
+ white-space:normal;
+ }
+ .copy-link {
+ width:100px;
+ }
+
+ .url {
+
+ input {
+ background-color: transparent;
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ color:#ccc;
+ width:100%;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/web/app/assets/stylesheets/web/web.css b/web/app/assets/stylesheets/web/web.css
index 5761892c5..12c614f5c 100644
--- a/web/app/assets/stylesheets/web/web.css
+++ b/web/app/assets/stylesheets/web/web.css
@@ -1,4 +1,6 @@
/**
+
+*= require ./Raleway
*= require client/jamServer
*= require client/ie
*= require client/jamkazam
@@ -28,6 +30,8 @@
*= require users/signinCommon
*= require dialogs/dialog
*= require client/help
+*= require landings/partner_agreement_v1
+*= require web/affiliate_links
*= require_directory ../landings
*= require icheck/minimal/minimal
*/
\ No newline at end of file
diff --git a/web/app/controllers/affiliates_controller.rb b/web/app/controllers/affiliates_controller.rb
new file mode 100644
index 000000000..2b5ed0876
--- /dev/null
+++ b/web/app/controllers/affiliates_controller.rb
@@ -0,0 +1,12 @@
+class AffiliatesController < ApplicationController
+
+ respond_to :html
+
+ def links
+
+ @partner = AffiliatePartner.find(params[:id])
+
+ render 'affiliate_links', layout: 'web'
+ end
+end
+
diff --git a/web/app/controllers/api_affiliate_controller.rb b/web/app/controllers/api_affiliate_controller.rb
new file mode 100644
index 000000000..98b59e89d
--- /dev/null
+++ b/web/app/controllers/api_affiliate_controller.rb
@@ -0,0 +1,53 @@
+class ApiAffiliateController < ApiController
+
+ before_filter :api_signed_in_user, :except => [ :create ]
+
+ include ErrorsHelper
+
+ respond_to :json
+
+ def log
+ @log || Logging.logger[ApiAffiliateController]
+ end
+
+ def create
+ if current_user
+ # is this user already an affiliate? Then kick this back
+ if current_user.affiliate_partner
+ render :json => simple_error('affiliate_partner', 'You are already an affiliate.'), status: 422
+ return
+ else
+ @partner = AffiliatePartner.create_with_web_params(current_user, params)
+ respond_with_model(@partner)
+ return
+ end
+ else
+ @partner = AffiliatePartner.create_with_web_params(nil, params)
+ respond_with_model(@partner)
+ end
+ end
+
+ def traffic_index
+ data = AffiliateTrafficTotal.index(current_user, params)
+ @traffics, @next = data[0], data[1]
+ render "api_affiliates/traffic_index", :layout => nil
+ end
+
+ def monthly_index
+ data = AffiliateMonthlyPayment.index(current_user, params)
+ @monthlies, @next = data[0], data[1]
+ render "api_affiliates/monthly_index", :layout => nil
+ end
+
+ def quarterly_index
+ data = AffiliateQuarterlyPayment.index(current_user, params)
+ @quarterlies, @next = data[0], data[1]
+ render "api_affiliates/quarterly_index", :layout => nil
+ end
+
+ def payment_index
+ data = AffiliatePayment.index(current_user, params)
+ @payments, @next = data[0], data[1]
+ render "api_affiliates/payment_index", :layout => nil
+ end
+end
diff --git a/web/app/controllers/api_bands_controller.rb b/web/app/controllers/api_bands_controller.rb
index 8b0c83ccd..879cb09f2 100644
--- a/web/app/controllers/api_bands_controller.rb
+++ b/web/app/controllers/api_bands_controller.rb
@@ -250,6 +250,7 @@ class ApiBandsController < ApiController
def auth_band_member
@band = Band.find(params[:id])
unless @band.users.exists? current_user
+ Rails.logger.info("Could not find #{current_user} in #{@band.users.inspect}")
raise JamPermissionError, ValidationMessages::PERMISSION_VALIDATION_ERROR
end
end
@@ -257,6 +258,7 @@ class ApiBandsController < ApiController
uid = current_user.id
@band = Band.find(params[:id])
unless @band.band_musicians.detect { |bm| bm.user_id == uid && bm.admin? }
+ Rails.logger.info("Could not find #{current_user} in #{@band.band_musicians.inspect}")
raise JamPermissionError, ValidationMessages::PERMISSION_VALIDATION_ERROR
end
end
diff --git a/web/app/controllers/api_controller.rb b/web/app/controllers/api_controller.rb
index ce17dbd9c..7aa20de41 100644
--- a/web/app/controllers/api_controller.rb
+++ b/web/app/controllers/api_controller.rb
@@ -69,6 +69,18 @@ class ApiController < ApplicationController
else
auth_user
end
-
end
-end
\ No newline at end of file
+
+ def affiliate_partner
+ if params[:affiliate_id]
+ @partner = AffiliatePartner.find(params[:affiliate_id])
+ if @partner.partner_user.nil?
+ raise JamPermissionError, ValidationMessages::PERMISSION_VALIDATION_ERROR
+ end
+ elsif current_user
+ @partner = current_user.affiliate_partner
+ else
+ raise JamPermissionError, ValidationMessages::PERMISSION_VALIDATION_ERROR
+ end
+ end
+end
diff --git a/web/app/controllers/api_links_controller.rb b/web/app/controllers/api_links_controller.rb
new file mode 100644
index 000000000..9f50d979f
--- /dev/null
+++ b/web/app/controllers/api_links_controller.rb
@@ -0,0 +1,114 @@
+class ApiLinksController < ApiController
+
+ respond_to :json
+
+ before_filter :api_any_user
+ before_filter :affiliate_partner
+
+ def log
+ @log || Logging.logger[ApiLinksController]
+ end
+
+ def jamtrack_song_index
+ @affiliate_params = affiliate_params('jamtrack-song')
+
+ results = []
+
+ @jamtracks, @next = JamTrack.index({offset: 0, limit:1000}, any_user)
+
+ @jamtracks.each do |jamtrack|
+ results << {url: individual_jamtrack_url(jamtrack.short_plan_code, @affiliate_params),
+ target: "#{jamtrack.original_artist} - #{jamtrack.name}" }
+ end
+
+ render json: results, status: 200
+ end
+
+ def jamtrack_band_index
+ @affiliate_params = affiliate_params('jamtrack-band')
+
+ results = []
+
+ @jamtracks, @next = JamTrack.index({offset: 0, limit:1000}, any_user)
+ @jamtracks.each do |jamtrack|
+ results << {url: individual_jamtrack_band_url(jamtrack.short_plan_code, @affiliate_params),
+ target: "#{jamtrack.original_artist} - #{jamtrack.name}" }
+ end
+
+ render json: results, status: 200
+ end
+
+ def jamtrack_general_index
+ @affiliate_params = affiliate_params('jamtrack-general')
+ @affiliate_params[:generic] = 1
+
+ results = []
+
+ @jamtracks, @next = JamTrack.index({offset: 0, limit:1000}, any_user)
+
+ @jamtracks.each do |jamtrack|
+ results << {url: individual_jamtrack_url(jamtrack.short_plan_code, @affiliate_params),
+ target: "#{jamtrack.original_artist} - #{jamtrack.name}" }
+ end
+
+ render json: results, status: 200
+ end
+
+ def jamkazam_general_index
+
+ results = []
+
+ @affiliate_params = affiliate_params('home')
+ results << {url: root_url(@affiliate_params), target: 'JamKazam Home'}
+
+ @affiliate_params = affiliate_params('products-jamblaster')
+ results << {url: product_jamblaster_url(@affiliate_params), target: 'JamBlaster'}
+
+ @affiliate_params = affiliate_params('products-jamtracks')
+ results << {url: product_jamtracks_url(@affiliate_params), target: 'JamTracks'}
+
+
+ render json: results, status: 200
+ end
+
+ def session_index
+
+ @affiliate_params = affiliate_params('session')
+
+ results = []
+
+ ActiveRecord::Base.transaction do
+ options = {offset:0, limit:50}
+ @music_sessions = MusicSession.scheduled(@partner.partner_user, true)
+
+ @music_sessions.each do |session|
+ results << {url: music_scheduled_session_detail_url(session.id, @affiliate_params), target: session.name}
+ end
+ end
+
+ render json: results, status: 200
+ end
+
+ def recording_index
+
+ @affiliate_params = affiliate_params('recording')
+
+ results = []
+
+ feeds, next_page = Feed.index(@partner.partner_user, :type => 'recording', time_range: 'all', limit:100, user: @partner.partner_user.id, )
+
+ feeds.each do |feed|
+ claim = feed.recording.candidate_claimed_recording
+ if claim
+ results << {url: share_token_url(claim.share_token.token, @affiliate_params), target: claim.name}
+ end
+ end
+
+ render json: results, status: 200
+ end
+
+ private
+ def affiliate_params(campaign)
+ {utm_source:'affiliate', utm_medium: 'affiliate', utm_campaign: "#{Date.today.year}-affiliate-#{campaign}", affiliate: @partner.id}
+ end
+end
diff --git a/web/app/controllers/api_music_sessions_controller.rb b/web/app/controllers/api_music_sessions_controller.rb
index 366469aad..32b7726fc 100644
--- a/web/app/controllers/api_music_sessions_controller.rb
+++ b/web/app/controllers/api_music_sessions_controller.rb
@@ -165,7 +165,8 @@ class ApiMusicSessionsController < ApiController
def show
unless @music_session.can_see? current_user
- raise JamRuby::PermissionError
+ # render :json => { :message => ValidationMessages::PERMISSION_VALIDATION_ERROR }, :status => 403
+ raise JamRuby::JamPermissionError
end
end
diff --git a/web/app/controllers/api_recurly_controller.rb b/web/app/controllers/api_recurly_controller.rb
index f3090e7a2..41c9c041e 100644
--- a/web/app/controllers/api_recurly_controller.rb
+++ b/web/app/controllers/api_recurly_controller.rb
@@ -34,7 +34,8 @@ class ApiRecurlyController < ApiController
password_confirmation: params[:password],
terms_of_service: terms_of_service,
location: {:country => billing_info[:country], :state => billing_info[:state], :city => billing_info[:city]},
- reuse_card: reuse_card_next_time
+ reuse_card: reuse_card_next_time,
+ affiliate_referral_id: cookies[:affiliate_visitor]
}
options = User.musician_defaults(request.remote_ip, ApplicationHelper.base_uri(request) + "/confirm", any_user, options)
diff --git a/web/app/controllers/api_users_controller.rb b/web/app/controllers/api_users_controller.rb
index c9210aa00..e8b42df82 100644
--- a/web/app/controllers/api_users_controller.rb
+++ b/web/app/controllers/api_users_controller.rb
@@ -26,7 +26,7 @@ class ApiUsersController < ApiController
@user = User.includes([{musician_instruments: :instrument},
{band_musicians: :user},
{genre_players: :genre},
- :bands, :instruments, :genres, :jam_track_rights])
+ :bands, :instruments, :genres, :jam_track_rights, :affiliate_partner])
.find(params[:id])
respond_with @user, responder: ApiResponder, :status => 200
@@ -64,7 +64,8 @@ class ApiUsersController < ApiController
password_confirmation: params[:password],
terms_of_service: params[:terms],
location: {:country => nil, :state => nil, :city => nil},
- signup_hint: signup_hint
+ signup_hint: signup_hint,
+ affiliate_referral_id: cookies[:affiliate_visitor]
}
options = User.musician_defaults(request.remote_ip, ApplicationHelper.base_uri(request) + "/confirm", any_user, options)
@@ -722,6 +723,40 @@ class ApiUsersController < ApiController
end
end
+ def affiliate_partner
+ if oo = current_user.affiliate_partner
+ if request.post?
+ oo.address = params[:address]
+ oo.tax_identifier = params[:tax_identifier]
+ oo.save!
+ render nothing: true
+
+ elsif request.get?
+ result = {}
+ result['account'] = {
+ 'address' => oo.address.clone,
+ 'tax_identifier' => oo.tax_identifier,
+ 'entity_type' => oo.entity_type,
+ 'partner_name' => oo.partner_name,
+ 'partner_id' => oo.partner_user_id,
+ 'id' => oo.id
+ }
+ if txt = oo.affiliate_legalese.try(:legalese)
+ txt = ControllerHelp.instance.simple_format(txt)
+ end
+ result['agreement'] = {
+ 'legalese' => txt,
+ 'signed_at' => oo.signed_at
+ }
+ #result['signups'] = oo.referrals_by_date
+ #result['earnings'] = [['April 2015', '1000 units', '$100']]
+ render json: result.to_json, status: 200
+ end
+ else
+ render :json => { :message => 'user not affiliate partner' }, :status => 400
+ end
+ end
+
def affiliate_report
begin
affiliate = User
diff --git a/web/app/controllers/application_controller.rb b/web/app/controllers/application_controller.rb
index 7f242aff0..114666eec 100644
--- a/web/app/controllers/application_controller.rb
+++ b/web/app/controllers/application_controller.rb
@@ -15,6 +15,7 @@ class ApplicationController < ActionController::Base
end
before_filter :set_tracking_cookie
+ before_filter :track_affiliate_visits
before_filter do
if params[AffiliatePartner::PARAM_REFERRAL].present? && current_user.nil?
@@ -35,6 +36,16 @@ class ApplicationController < ActionController::Base
cookies.permanent[:user_uuid] = SecureRandom.uuid unless cookies[:user_uuid]
end
+ def track_affiliate_visits
+ if params[:affiliate] && params[:utm_medium] == 'affiliate' && params[:utm_source] == 'affiliate'
+ visit_cookie = cookies[:affiliate_visitor]
+ AffiliateReferralVisit.track(affiliate_id: params[:affiliate], visited: visit_cookie, remote_ip: request.remote_ip, visited_url: request.fullpath, referral_url: request.referer, current_user: current_user)
+
+ # set a cookie with the ID of the partner, and expires in 24 hours
+ cookies[:affiliate_visitor] = { :value => params[:affiliate], :expires => Time.now + 3600 * 24} # 1 day from now
+ end
+ end
+
private
def add_user_info_to_bugsnag(notif)
@@ -49,3 +60,14 @@ class ApplicationController < ActionController::Base
end
end
end
+
+class ControllerHelp
+ include Singleton
+ include ActionView::Helpers::TextHelper
+ include ActionView::Helpers::UrlHelper
+ include ActionView::Helpers::SanitizeHelper
+ extend ActionView::Helpers::SanitizeHelper::ClassMethods
+ include ActionView::Helpers::JavaScriptHelper
+ include ActionView::Helpers::TagHelper
+ include ActionView::Helpers::AssetTagHelper
+end
diff --git a/web/app/controllers/landings_controller.rb b/web/app/controllers/landings_controller.rb
index 5700ac543..ef23ba7d8 100644
--- a/web/app/controllers/landings_controller.rb
+++ b/web/app/controllers/landings_controller.rb
@@ -103,5 +103,10 @@ class LandingsController < ApplicationController
gon.jam_track_plan_code = jam_track.plan_code if jam_track
render 'product_jamtracks', layout: 'web'
end
+
+ def affiliate_program
+ render 'affiliate_program', layout: 'web'
+ end
+
end
diff --git a/web/app/controllers/sessions_controller.rb b/web/app/controllers/sessions_controller.rb
index 36c54e58c..931960fdb 100644
--- a/web/app/controllers/sessions_controller.rb
+++ b/web/app/controllers/sessions_controller.rb
@@ -65,7 +65,8 @@ class SessionsController < ApplicationController
user = UserManager.new.signup(remote_ip: remote_ip(),
first_name: auth_hash[:info][:first_name],
last_name: auth_hash[:info][:last_name],
- email: auth_hash[:info][:email])
+ email: auth_hash[:info][:email],
+ affiliate_referral_id: cookies[:affiliate_visitor])
# Users who sign up using oauth are presumed to have valid email adddresses.
user.confirm_email!
@@ -132,6 +133,7 @@ class SessionsController < ApplicationController
email: email,
terms_of_service: true,
location: {:country => nil, :state => nil, :city => nil},
+ affiliate_referral_id: cookies[:affiliate_visitor]
}
options = User.musician_defaults(request.remote_ip, ApplicationHelper.base_uri(request) + "/confirm", any_user, options)
diff --git a/web/app/controllers/users_controller.rb b/web/app/controllers/users_controller.rb
index 47675f9ce..92fbb1f52 100644
--- a/web/app/controllers/users_controller.rb
+++ b/web/app/controllers/users_controller.rb
@@ -70,6 +70,7 @@ class UsersController < ApplicationController
end
end
+ @affiliate_partner = load_affiliate_partner(params)
@invited_user = load_invited_user(params)
if !@invited_user.nil? && @invited_user.has_required_email? && @invited_user.accepted
@@ -77,7 +78,7 @@ class UsersController < ApplicationController
render "already_signed_up", :layout => 'landing'
return
end
- @signup_postback = load_postback(@invited_user, @fb_signup)
+ @signup_postback = load_postback(@invited_user, @fb_signup, @affiliate_partner)
load_location(request.remote_ip)
@@ -136,7 +137,8 @@ class UsersController < ApplicationController
end
@invited_user = load_invited_user(params)
- @signup_postback = load_postback(@invited_user, @fb_signup)
+ @affiliate_partner = load_affiliate_partner(params)
+ @signup_postback = load_postback(@invited_user, @fb_signup, @affiliate_partner)
instruments = fixup_instruments(params[:jam_ruby_user][:instruments])
@@ -161,7 +163,8 @@ class UsersController < ApplicationController
invited_user: @invited_user,
fb_signup: @fb_signup,
signup_confirm_url: ApplicationHelper.base_uri(request) + "/confirm",
- affiliate_referral_id: AffiliatePartner.coded_id(self.affiliate_code))
+ affiliate_referral_id: cookies[:affiliate_visitor],
+ affiliate_partner: @affiliate_partner)
# check for errors
if @user.errors.any?
@@ -196,9 +199,14 @@ class UsersController < ApplicationController
render :layout => "web"
end
- # DO NOT USE CURRENT_USER IN THIS ROUTINE. IT'S CACHED FOR THE WHOLE SITE
+ # DO NOT USE CURRENT_USER IN THIS ROUTINE UNLESS REDIRECTING. IT'S CACHED FOR THE WHOLE SITE
def home
+ if current_user
+ redirect_to "/client#/home"
+ return
+ end
+
@no_user_dropdown = false
@promo_buzz = PromoBuzz.active
@@ -209,7 +217,6 @@ class UsersController < ApplicationController
end
- gon.signed_in = !current_user.nil?
render :layout => "web"
end
@@ -464,6 +471,12 @@ JS
return invited_user
end
+ def load_affiliate_partner(params)
+ partner_id = params[:affiliate_partner_id]
+
+ AffiliatePartner.find(partner_id) if partner_id
+ end
+
def load_location(remote_ip, location = nil)
# useful if you need to repro something on 127.0.0.1
# remote_ip = ' 23.119.29.89'
@@ -482,10 +495,11 @@ JS
@cities = @location[:state].nil? ? [] : MaxMindManager.cities(@location[:country], @location[:state])
end
- def load_postback(invited_user, fb_signup)
+ def load_postback(invited_user, fb_signup, affiliate_partner)
query = {}
query[:invitation_code] = invited_user.invitation_code if invited_user
query[:facebook_signup] = fb_signup.lookup_id if fb_signup
+ query[:affiliate_partner_id] = affiliate_partner.id if affiliate_partner
if query.length > 0
signup_path + "?" + query.to_query
else
diff --git a/web/app/helpers/errors_helper.rb b/web/app/helpers/errors_helper.rb
new file mode 100644
index 000000000..bb97b5367
--- /dev/null
+++ b/web/app/helpers/errors_helper.rb
@@ -0,0 +1,7 @@
+module ErrorsHelper
+
+ def simple_error(field, error_msg)
+ {"errors" => {field => [error_msg]}}
+ end
+
+end
\ No newline at end of file
diff --git a/web/app/helpers/sessions_helper.rb b/web/app/helpers/sessions_helper.rb
index a5e914512..8ce8f71f2 100644
--- a/web/app/helpers/sessions_helper.rb
+++ b/web/app/helpers/sessions_helper.rb
@@ -22,7 +22,6 @@ module SessionsHelper
end
end
-
# should be set whenever a user logs in who has redeemed a free jamtrack, or whenever the user
def set_purchased_jamtrack_cookie
cookies.permanent[:redeemed_jamtrack] = true
diff --git a/web/app/views/affiliates/affiliate_links.html.slim b/web/app/views/affiliates/affiliate_links.html.slim
new file mode 100644
index 000000000..c86d86fb2
--- /dev/null
+++ b/web/app/views/affiliates/affiliate_links.html.slim
@@ -0,0 +1,119 @@
+- provide(:page_name, 'landing_page full landing_product affiliate_links')
+- provide(:description, 'Affiliate Links')
+
+h2 Affiliate Links
+p.intro
+ | This page provides you with lists of ready-to-use links you can use to direct your followers to JamKazam.
+ | These links include your unique affiliate ID, and users who follow these links to JamKazam and register for an account will be
+ | tagged with your affiliate ID, so that you will be paid on their purchase per the terms of the affiliate agreement.
+
+h3 Table of Contents
+ul
+ li
+ a href='#header_jamtrack_songs' JamTrack Songs
+ li
+ a href='#header_jamtrack_bands' JamTrack Bands
+ li
+ a href='#header_jamtrack_general' JamTrack Generic
+ li
+ a href='#header_jamkazam' JamKazam General
+ li
+ a href='#header_sessions' Sessions
+ li
+ a href='#header_recordings' Recordings
+ li
+ a href='#header_custom_links' Custom Links
+h3#header_jamtrack_songs JamTrack Songs
+.link-type-prompt data-type='jamtrack_songs'
+ | These links take users directly to the "landing page" for a JamTrack - i.e. an individual piece of music. This would be a great fit, for example, if you have produced a YouTube tutorial on how to play a particular song, or if you have music notation for a particular song, etc.
+table.links-table.jamtrack_songs
+ thead
+ tr
+ th.target TARGET PAGE
+ th.copy-link
+ th.url URL
+ tbody
+
+h3#header_jamtrack_bands JamTrack Bands
+.link-type-prompt data-type='jamtrack_bands'
+ | These links take users directly to the "landing page" for a band to promote all the JamTracks by that band, not just an individual song. This would be a great fit, for example, if you have music notation for several songs by a band, etc.
+table.links-table.jamtrack_bands
+ thead
+ tr
+ th.target TARGET PAGE
+ th.copy-link
+ th.url URL
+ tbody
+
+h3#header_jamtrack_general JamTrack General
+.link-type-prompt data-type='jamtrack_general'
+ | These links take users directly to a"landing page" that promotes JamTracks in general. This page will feature the song listed in the link as an example of a JamTrack, but the landing page is built to promote JamTracks in general versus promoting just the one song. This is a good fit if you want to let your followers know about JamTracks in general.
+table.links-table.jamtrack_general
+ thead
+ tr
+ th.target TARGET PAGE
+ th.copy-link
+ th.url URL
+ tbody
+
+h3#header_jamkazam JamKazam Generic
+.link-type-prompt data-type='jamkazam'
+ | These links take users directly to a product page that promotes JamKazam more generally. This is a good fit if you want to let your followers know about JamKazam or its products in general.
+table.links-table.jamkazam
+ thead
+ tr
+ th.target TARGET PAGE
+ th.copy-link
+ th.url URL
+ tbody
+
+h3#header_sessions Sessions
+.link-type-prompt data-type='sessions'
+ | These links take users to a page where they can listen to a session you have organized, and in which you are scheduled to perform, either alone or with others. This is a good fit if you can perform either solo or in a group with other musicians in a JamKazam session, and draw an audience to listen to your session. During the session, you can recommend that your audience members sign up for JamKazam from this page. Below is a list of your currently scheduled JamKazam sessions for which you may share links.
+table.links-table.sessions
+ thead
+ tr
+ th.target TARGET PAGE
+ th.copy-link
+ th.url URL
+ tbody
+
+h3#header_recordings Recordings
+.link-type-prompt data-type='recordings'
+ | These links take users to a page with a recording you have made in a JamKazam session. This is a good fit if you have made a nice recording in a JamKazam session and can share it with your followers via Facebook, Twitter, email, and so on. Below is a list of your most recent JamKazam recordings for which you may share links.
+table.links-table.recordings
+ thead
+ tr
+ th.target TARGET PAGE
+ th.copy-link
+ th.url URL
+ tbody
+
+h3#header_custom_links Custom Links
+.link-type-prompt data-type='custom_links'
+ p You may also link to any page on the JamKazam website and append the following text to the URL of the page to which you are linking:
+
+ p.example-link
+ | ?utm_source=affiliate&utm_medium=affiliate&utm_campaign=2015-affiliate-custom&affiliate=
+ span.affiliate_id = @partner.id
+
+ p For example, if you were linking to the JamKazam home page, you would combine https://www.jamkazam.com with the text above, and the result would be:
+
+ p.example-link
+ | https://www.jamkazam.com?utm_source=affiliate&utm_medium=affiliate&utm_campaign=2015-affiliate-custom&affiliate=
+ span.affiliate_id = @partner.id
+
+javascript:
+ $(document).on('JAMKAZAM_READY', function (e, data) {
+ var affiliateLinks = new JK.AffiliateLinks(data.app, '#{@partner.id}');
+ affiliateLinks.initialize();
+ })
+
+script type="text/template" id="template-affiliate-link-row"
+ tr
+ td.target
+ | {{data.target}}
+ td.copy-link
+ a href='#' select link
+ td.url
+ input type="text" value="{{data.url}}"
\ No newline at end of file
diff --git a/web/app/views/api_affiliates/create.rabl b/web/app/views/api_affiliates/create.rabl
new file mode 100644
index 000000000..bd016e7bc
--- /dev/null
+++ b/web/app/views/api_affiliates/create.rabl
@@ -0,0 +1,3 @@
+object @partner
+
+extends "api_affiliates/show"
\ No newline at end of file
diff --git a/web/app/views/api_affiliates/monthly_index.rabl b/web/app/views/api_affiliates/monthly_index.rabl
new file mode 100644
index 000000000..3446d43ea
--- /dev/null
+++ b/web/app/views/api_affiliates/monthly_index.rabl
@@ -0,0 +1,8 @@
+node :next do |page|
+ @next
+end
+
+node :monthlies do |page|
+ partial "api_affiliates/monthly_show", object: @monthlies
+end
+
diff --git a/web/app/views/api_affiliates/monthly_show.rabl b/web/app/views/api_affiliates/monthly_show.rabl
new file mode 100644
index 000000000..7efad0339
--- /dev/null
+++ b/web/app/views/api_affiliates/monthly_show.rabl
@@ -0,0 +1,3 @@
+object @monthly
+
+attribute :closed, :due_amount_in_cents, :affiliate_partner_id, :month, :year
\ No newline at end of file
diff --git a/web/app/views/api_affiliates/payment_index.rabl b/web/app/views/api_affiliates/payment_index.rabl
new file mode 100644
index 000000000..505f0d0e0
--- /dev/null
+++ b/web/app/views/api_affiliates/payment_index.rabl
@@ -0,0 +1,8 @@
+node :next do |page|
+ @next
+end
+
+node :payments do |page|
+ partial "api_affiliates/payment_show", object: @payments
+end
+
diff --git a/web/app/views/api_affiliates/payment_show.rabl b/web/app/views/api_affiliates/payment_show.rabl
new file mode 100644
index 000000000..1ac51e258
--- /dev/null
+++ b/web/app/views/api_affiliates/payment_show.rabl
@@ -0,0 +1,3 @@
+object @quarterly
+
+attribute :closed, :paid, :due_amount_in_cents, :affiliate_partner_id, :quarter, :month, :year, :payment_type, :jamtracks_sold
\ No newline at end of file
diff --git a/web/app/views/api_affiliates/quarterly_index.rabl b/web/app/views/api_affiliates/quarterly_index.rabl
new file mode 100644
index 000000000..a492bfa6a
--- /dev/null
+++ b/web/app/views/api_affiliates/quarterly_index.rabl
@@ -0,0 +1,8 @@
+node :next do |page|
+ @next
+end
+
+node :quarterlies do |page|
+ partial "api_affiliates/quarterly_show", object: @quarterlies
+end
+
diff --git a/web/app/views/api_affiliates/quarterly_show.rabl b/web/app/views/api_affiliates/quarterly_show.rabl
new file mode 100644
index 000000000..6238f5bc6
--- /dev/null
+++ b/web/app/views/api_affiliates/quarterly_show.rabl
@@ -0,0 +1,3 @@
+object @quarterly
+
+attribute :closed, :paid, :due_amount_in_cents, :affiliate_partner_id, :quarter, :year
\ No newline at end of file
diff --git a/web/app/views/api_affiliates/show.rabl b/web/app/views/api_affiliates/show.rabl
new file mode 100644
index 000000000..837dc9eed
--- /dev/null
+++ b/web/app/views/api_affiliates/show.rabl
@@ -0,0 +1,2 @@
+
+attributes :id, :partner_user_id, :partner_name, :entity_type
\ No newline at end of file
diff --git a/web/app/views/api_affiliates/traffic_index.rabl b/web/app/views/api_affiliates/traffic_index.rabl
new file mode 100644
index 000000000..f5647a946
--- /dev/null
+++ b/web/app/views/api_affiliates/traffic_index.rabl
@@ -0,0 +1,8 @@
+node :next do |page|
+ @next
+end
+
+node :traffics do |page|
+ partial "api_affiliates/traffic_show", object: @traffics
+end
+
diff --git a/web/app/views/api_affiliates/traffic_show.rabl b/web/app/views/api_affiliates/traffic_show.rabl
new file mode 100644
index 000000000..e60d6da02
--- /dev/null
+++ b/web/app/views/api_affiliates/traffic_show.rabl
@@ -0,0 +1,3 @@
+object @traffic
+
+attribute :day, :visits, :signups, :affiliate_partner_id
\ No newline at end of file
diff --git a/web/app/views/api_users/show.rabl b/web/app/views/api_users/show.rabl
index 0c217486b..412b38a6f 100644
--- a/web/app/views/api_users/show.rabl
+++ b/web/app/views/api_users/show.rabl
@@ -34,6 +34,18 @@ if @user == current_user
@user.recurly_code == @user.id
end
+ node :is_affiliate_partner do
+ @user.affiliate_partner.present?
+ end
+
+ node :affiliate_referral_count do
+ @user.affiliate_partner.try(:referral_user_count)
+ end
+
+ node :affiliate_earnings do
+ @user.affiliate_partner.try(:cumulative_earnings_in_cents)
+ end
+
elsif current_user
node :is_friend do |uu|
current_user.friends?(@user)
diff --git a/web/app/views/clients/_account.html.erb b/web/app/views/clients/_account.html.erb
index af5e85f10..29d806a94 100644
--- a/web/app/views/clients/_account.html.erb
+++ b/web/app/views/clients/_account.html.erb
@@ -151,6 +151,35 @@
{% } %}
+
+
+
+
+
affiliate:
+
+
+ {% if (data.is_affiliate_partner) { %}
+
+
+ You have referred {{ data.affiliate_referral_count }} users to date.
+
+ You have earned ${{ data.affiliate_earnings }} to date.
+
+
+
+ {% } else { %}
+
+ {% } %}
+
+
diff --git a/web/app/views/clients/_account_affiliate_partner.html.slim b/web/app/views/clients/_account_affiliate_partner.html.slim
new file mode 100644
index 000000000..8280cf9b9
--- /dev/null
+++ b/web/app/views/clients/_account_affiliate_partner.html.slim
@@ -0,0 +1,193 @@
+/! Account affiliates Dialog
+#account-affiliate-partner.screen.secondary layout='screen' layout-id='account/affiliatePartner'
+ .content-head
+ .content-icon
+ = image_tag "content/icon_account.png", :width => 27, :height => 20
+ h1 my account
+ = render "screen_navigation"
+
+ /! affiliates scrolling area
+ .content-body
+ .content-body-scroller.account-content-scroller#account-affiliate-partner-content-scroller
+ .content-wrapper.account-affiliates
+ .affiliates-header
+ .left.affiliates-caption
+ h2 affiliate:
+ .clearall
+ .affiliate-partner-nav
+ a#affiliate-partner-agreement-link agreement
+ a#affiliate-partner-earnings-link earnings
+ a#affiliate-partner-signups-link signups
+ a#affiliate-partner-links-link links
+ a#affiliate-partner-account-link.active account
+ .clearall
+
+ .affiliate-partner-account
+ .clearall
+ .affiliate-partner-links
+ .clearall
+ .affiliate-partner-agreement
+ .clearall
+ .affiliate-partner-signups
+ .clearall
+ .affiliate-partner-earnings
+ .clearall
+ #affiliate-partner-tab-content
+
+ .clearall
+
+script type="text/template" id="template-affiliate-partner-account"
+ .tab-account
+ .right-col
+ | We must have a complete mailing address and a valid tax ID in order to process and mail payments due to all affiliates. Per the terms of the affiliate agreement, if this information is not available within 90 days of the end of a calendar quarter, then any payment obligation due to the affiliate for such calendar quarter shall be considered fully and permanently discharged, and no further payment for such calendar quarter shall be due or payable to affiliate.
+ br
+ | So please provide this data, and be sure to keep it current!
+
+ .left-col
+ .affiliate-label Affiliate:
+ .w80= "{{ data.partner_name }} ({{data.entity_type}})"
+ br
+ .affiliate-label Street Address 1:
+ = text_field_tag('affiliate_partner_address1', "{{ data.address.address1 }}", {class: 'w60'})
+ br
+ .affiliate-label Street Address 2:
+ = text_field_tag('affiliate_partner_address2', "{{ data.address.address2 }}", {class: 'w60'})
+ br
+ .affiliate-label City:
+ = text_field_tag('affiliate_partner_city', "{{ data.address.city }}", {class: 'w60'})
+ br
+ .affiliate-label State/Region:
+ = text_field_tag('affiliate_partner_state', "{{ data.address.state }}", {class: 'w60'})
+ br
+ .affiliate-label Zip/Postal Code:
+ = text_field_tag('affiliate_partner_postal_code', "{{ data.address.postal_code }}", {class: 'w60'})
+ br
+ .affiliate-label Country:
+ = text_field_tag('affiliate_partner_country', "{{ data.address.country }}", {class: 'w60'})
+ br
+ br
+ .affiliate-label Tax ID:
+ = text_field_tag('affiliate_partner_tax_identifier', "{{ data.tax_identifier }}", {class: 'w60'})
+ br
+ .spacer
+ .input-buttons
+ .right
+ a.button-grey href="javascript:history.go(-1)" CANCEL
+ a.button-orange id="affiliate-profile-account-submit" href="#" UPDATE
+ .clearall
+ .clearall
+
+script type="text/template" id="template-affiliate-partner-agreement"
+ .agreement
+ label.partner-agreement You are viewing:
+ select.easydropdown name='agreement'
+ option value="Current agreement in effect" Current agreement in effect
+ br
+ h2 JamKazam Affiliate Agreement
+ .execution-date
+ | (you executed this Agreement on {{ window.JK.formatDate(data.signed_at) }})
+
+ = render "legal/partner_agreement_v1"
+
+ .input-buttons
+ .right
+ a.button-orange href='/client#/account' BACK TO ACCOUNT
+
+script type="text/template" id="template-affiliate-partner-signups"
+ table.traffic-table.jamtable
+ thead
+ tr
+ th.day DATE
+ th.signups SIGNUPS
+ th.visits VISITS
+ tbody
+
+script type="text/template" id="template-affiliate-partner-links"
+ .links
+ p.prompt
+ | This page provides you with lists of ready-to-use links you can use to direct your followers to JamKazam.
+ | These links include your unique affiliate ID, and users who follow these links to JamKazam and register for an account will be
+ | tagged with your affiliate ID, so that you will be paid on their purchase per the terms of the
+ a.affiliate-agreement rel='#' affiliate agreement
+ | . You can also find a
+ a.affiliate-link-page href='#' rel="external" single page listing all affiliate links
+ | which you can share with others who may need to share out affiliate links on your behalf.
+ .link-type-section
+ label Link Type:
+ select.link_type.easydropdown name="link_type"
+ option value="JamTrack Song" JamTrack Song
+ option value="JamTrack Band" JamTrack Band
+ option value="JamTrack General" JamTrack General
+ option value="JamKazam General" JamKazam General
+ option value="JamKazam Session" JamKazam Session
+ option value="JamKazam Recording" JamKazam Recording
+ option value="Custom Link" Custom Link
+ .link-type-prompt data-type='jamtrack_songs'
+ | These links take users directly to the "landing page" for a JamTrack - i.e. an individual piece of music. This would be a great fit, for example, if you have produced a YouTube tutorial on how to play a particular song, or if you have music notation for a particular song, etc.
+ .link-type-prompt data-type='jamtrack_bands'
+ | These links take users directly to the "landing page" for a band to promote all the JamTracks by that band, not just an individual song. This would be a great fit, for example, if you have music notation for several songs by a band, etc.
+ .link-type-prompt data-type='jamtrack_general'
+ | These links take users directly to a"landing page" that promotes JamTracks in general. This page will feature the song listed in the link as an example of a JamTrack, but the landing page is built to promote JamTracks in general versus promoting just the one song. This is a good fit if you want to let your followers know about JamTracks in general.
+ .link-type-prompt data-type='jamkazam'
+ | These links take users directly to a product page that promotes JamKazam more generally. This is a good fit if you want to let your followers know about JamKazam or its products in general.
+ .link-type-prompt data-type='sessions'
+ | These links take users to a page where they can listen to a session you have organized, and in which you are scheduled to perform, either alone or with others. This is a good fit if you can perform either solo or in a group with other musicians in a JamKazam session, and draw an audience to listen to your session. During the session, you can recommend that your audience members sign up for JamKazam from this page. Below is a list of your currently scheduled JamKazam sessions for which you may share links.
+ .link-type-prompt data-type='recordings'
+ | These links take users to a page with a recording you have made in a JamKazam session. This is a good fit if you have made a nice recording in a JamKazam session and can share it with your followers via Facebook, Twitter, email, and so on. Below is a list of your most recent JamKazam recordings for which you may share links.
+ .link-type-prompt data-type='custom_links'
+ p You may also link to any page on the JamKazam website and append the following text to the URL of the page to which you are linking:
+
+ p.example-link
+ | ?utm_source=affiliate&utm_medium=affiliate&utm_campaign=2015-affiliate-custom&affiliate=
+ span.affiliate_id
+
+ p For example, if you were linking to the JamKazam home page, you would combine https://www.jamkazam.com with the text above, and the result would be:
+
+ p.example-link
+ | https://www.jamkazam.com?utm_source=affiliate&utm_medium=affiliate&utm_campaign=2015-affiliate-custom&affiliate=
+ span.affiliate_id
+
+ table.links-table
+ thead
+ tr
+ th.target TARGET PAGE
+ th.copy-link
+ th.url URL
+ tbody
+
+script type="text/template" id="template-affiliate-partner-signups-row"
+ tr
+ td.day
+ | {{data.day}}
+ td.signups
+ | {{data.signups}}
+ td.visits
+ | {{data.visits}}
+
+script type="text/template" id="template-affiliate-partner-earnings"
+ table.payment-table.jamtable
+ thead
+ tr
+ th.month MONTH
+ th.sales SALES
+ th.earnings AFFILIATE EARNINGS
+ tbody
+
+script type="text/template" id="template-affiliate-partner-earnings-row"
+ tr data-type="{{data.payment_type}}"
+ td.month
+ | {{data.time}}
+ td.sales
+ | {{data.sold}}
+ td.earnings
+ | {{data.earnings}}
+
+
+script type="text/template" id="template-affiliate-link-entry"
+ tr
+ td.target
+ | {{data.target}}
+ td.copy-link
+ a href='#' select link
+ td.url
+ input type="text" value="{{data.url}}"
\ No newline at end of file
diff --git a/web/app/views/clients/_help.html.slim b/web/app/views/clients/_help.html.slim
index dac0816e4..c81528e9c 100644
--- a/web/app/views/clients/_help.html.slim
+++ b/web/app/views/clients/_help.html.slim
@@ -286,3 +286,27 @@ script type="text/template" id="template-help-band-profile-play-paid-gigs"
script type="text/template" id="template-help-band-profile-play-free-gigs"
| For bands that are interested in playing free gigs, either for fun or to build experience.
+
+script type="text/template" id="template-help-jamtrack-landing-preview"
+ .jamtrack-landing-preview.big-help
+ p click a play button to preview the master mix and individual tracks of the JamTrack
+
+script type="text/template" id="template-help-jamtrack-landing-video"
+ .jamtrack-landing-video.big-help
+ p click to watch JamTracks video
+
+script type="text/template" id="template-help-jamtrack-landing-cta"
+ .jamtrack-landing-cta.big-help
+ p click to browse through our JamTracks collection and get your first one free!
+
+script type="text/template" id="template-help-jamtrack-browse-band"
+ .jamtrack-browse-band.big-help
+ p List JamTracks of a specified band
+
+script type="text/template" id="template-help-jamtrack-browse-master-mix"
+ .jamtrack-browse-master-mix.big-help
+ p Listen to master mix and individual tracks
+
+script type="text/template" id="template-help-jamtrack-browse-cta"
+ .jamtrack-browse-cta.big-help
+ p Click to select your first free JamTrack!
diff --git a/web/app/views/clients/_jam_track_preview.html.slim b/web/app/views/clients/_jam_track_preview.html.slim
index 1fe91fb33..bf6f22d40 100644
--- a/web/app/views/clients/_jam_track_preview.html.slim
+++ b/web/app/views/clients/_jam_track_preview.html.slim
@@ -6,4 +6,5 @@ script type="text/template" id='template-jam-track-preview'
img.instrument-icon hoveraction="instrument" data-instrument-id="" width="24" height="24"
.instrument-name
.part
- .loading.spinner-small.hidden
\ No newline at end of file
+ .loading.spinner-small.hidden
+ .loading-text.hidden preview loading
\ No newline at end of file
diff --git a/web/app/views/clients/_profile_online_sample_controls.html.slim b/web/app/views/clients/_profile_online_sample_controls.html.slim
index 604804288..55f59fb39 100644
--- a/web/app/views/clients/_profile_online_sample_controls.html.slim
+++ b/web/app/views/clients/_profile_online_sample_controls.html.slim
@@ -1,69 +1,88 @@
.profile-online-sample-controls
- .sample_row
- .left
- label Website (URL):
- #url_validator.left.presence.site_validator
- input#website maxlength="4000" type="text"
- span.spinner-small
- .left
- label SoundCloud (username):
- #soundcloud_validator.left.presence.site_validator
- input#soundcloud-username maxlength="100" type="text"
- span.spinner-small
- .left
- label ReverbNation (username):
- #reverbnation_validator.left.presence.site_validator
- input#reverbnation-username maxlength="100" type="text"
- span.spinner-small
- .left
- label Bandcamp (username):
- #bandcamp_validator.left.presence.site_validator
- input#bandcamp-username maxlength="100" type="text"
- span.spinner-small
- .sample_row
- .left
- label Fandalism (URL):
- #fandalism_validator.left.presence.site_validator
- input#fandalism-username maxlength="100" type="text"
- span.spinner-small
- .left
- label YouTube (username):
- #youtube_validator.left.presence.site_validator
- input#youtube-username maxlength="100" type="text"
- span.spinner-small
- .left
- label Facebook (username):
- #facebook_validator.left.presence.site_validator
- input#facebook-username maxlength="100" type="text"
- span.spinner-small
- .left
- label Twitter (username):
- #twitter_validator.left.presence.site_validator
- input#twitter-username maxlength="100" type="text"
- span.spinner-small
- .sample_row.samples-container
- .left.samples.jamkazam
- label JamKazam Recordings:
- .controls
- .left
- a#btn-add-jk-recording.button-grey BROWSE
- br.clearall
- .sample-list
- .left.samples.soundcloud
- label SoundCloud Recordings (URL):
- .controls
- #rec_soundcloud_validator.left.sample.site_validator
- input#soundcloud-recording maxlength="4000" type="text"
- a#btn-add-soundcloud-recording.button-grey.add-recording-source ADD
- span.spinner-small
- br.clearall
- .sample-list
- .left.samples.youtube
- label YouTube Videos (URL):
- .controls
- #rec_youtube_validator.left.sample.site_validator
- input#youtube-video maxlength="4000" type="text"
- a#btn-add-youtube-video.button-grey.add-recording-source ADD
- span.spinner-small
- br.clearall
- .sample-list
\ No newline at end of file
+ table.profile-table
+ tr
+ td colspan="25%": label Website (URL):
+ td colspan="25%": label SoundCloud (username):
+ td colspan="25%": label ReverbNation (username):
+ td colspan="25%": label Bandcamp (username):
+ tr
+ td colspan="25%"
+ table.control-table: tr.url_validator.presence.site_validator
+ td colspan="100%"
+ input.website maxlength="4000" type="text"
+ td
+ span.spinner-small
+ td colspan="25%"
+ table.control-table: tr.soundcloud_validator.presence.site_validator
+ td colspan="100%"
+ input.soundcloud-username maxlength="100" type="text"
+ td
+ span.spinner-small
+ td colspan="25%"
+ table.control-table: tr.reverbnation_validator.presence.site_validator
+ td colspan="100%"
+ input.reverbnation-username maxlength="100" type="text"
+ td
+ span.spinner-small
+ td colspan="25%"
+ table.control-table: tr.bandcamp_validator.presence.site_validator
+ td colspan="100%"
+ input.bandcamp-username maxlength="100" type="text"
+ td
+ span.spinner-small
+
+ tr
+ td colspan="25%": label Fandalism (URL):
+ td colspan="25%": label YouTube (username):
+ td colspan="25%": label Facebook (username):
+ td colspan="25%": label Twitter (username):
+ tr
+ td colspan="25%"
+ table.control-table: tr.fandalism_validator.presence.site_validator
+ td colspan="100%"
+ input.fandalism-username maxlength="100" type="text"
+ td
+ span.spinner-small
+ td colspan="25%"
+ table.control-table: tr.youtube_validator.presence.site_validator
+ td colspan="100%"
+ input.youtube-username maxlength="100" type="text"
+ td
+ span.spinner-small
+ td colspan="25%"
+ table.control-table: tr.facebook_validator.presence.site_validator
+ td colspan="100%"
+ input.facebook-username maxlength="100" type="text"
+ td
+ span.spinner-small
+ td colspan="25%"
+ table.control-table: tr.twitter_validator.presence.site_validator
+ td colspan="100%"
+ input.twitter-username maxlength="100" type="text"
+ td
+ span.spinner-small
+ tr
+ td colspan="33.33%": label JamKazam Recordings:
+ td colspan="33.33%": label SoundCloud Recordings (URL):
+ td colspan="33.33%": label YouTube Videos (URL):
+ tr
+ td colspan="33.33%"
+ a.btn-add-jk-recording.button-grey BROWSE
+ td colspan="33.33%"
+ table.control-table: tr.rec_soundcloud_validator.sample.site_validator
+ td colspan="100%"
+ input.soundcloud-recording maxlength="4000" type="text"
+ td
+ a.btn-add-soundcloud-recording.button-grey.add-recording-source ADD
+ span.spinner-small
+ td colspan="33.33%"
+ table.control-table: tr.rec_youtube_validator.sample.site_validator
+ td colspan="100%"
+ input.youtube-video maxlength="4000" type="text"
+ td
+ a.btn-add-youtube-video.button-grey.add-recording-source ADD
+ span.spinner-small
+ tr
+ td colspan="33.33%": .sample-list
+ td colspan="33.33%": .sample-list
+ td colspan="33.33%": .sample-list
\ No newline at end of file
diff --git a/web/app/views/clients/index.html.erb b/web/app/views/clients/index.html.erb
index b23b931e7..9864066b9 100644
--- a/web/app/views/clients/index.html.erb
+++ b/web/app/views/clients/index.html.erb
@@ -63,6 +63,7 @@
<%= render "account_video_profile" %>
<%= render "account_sessions" %>
<%= render "account_jamtracks" %>
+<%= render "account_affiliate_partner" %>
<%= render "account_session_detail" %>
<%= render "account_session_properties" %>
<%= render "account_payment_history" %>
@@ -110,6 +111,8 @@
};
}
+ var api = JK.Rest()
+
<% if current_user %>
JK.currentUserId = '<%= current_user.id %>';
JK.currentUserAvatarUrl = JK.resolveAvatarUrl('<%= current_user.photo_url %>');
@@ -165,7 +168,7 @@
var openBackingTrackDialog = new JK.OpenBackingTrackDialog(JK.app);
openBackingTrackDialog.initialize();
- var configureTracksDialog = new JK.ConfigureTracksDialog(JK.app);
+ var configureTracksDialog = new JK.ConfigureTracksDialog(JK.app, null, api.getUserProfile, api.updateUser)
configureTracksDialog.initialize();
var networkTestDialog = new JK.NetworkTestDialog(JK.app);
@@ -215,6 +218,9 @@
var accountSessionPropertiesScreen = new JK.AccountSessionProperties(JK.app);
accountSessionPropertiesScreen.initialize();
+ var accountAffiliateScreen = new JK.AccountAffiliateScreen(JK.app);
+ accountAffiliateScreen.initialize();
+
var affiliateReportScreen = new JK.AffiliateReportScreen(JK.app);
affiliateReportScreen.initialize();
@@ -230,7 +236,7 @@
var accountProfileInterests = new JK.AccountProfileInterests(JK.app);
accountProfileInterests.initialize();
- var accountProfileSamples = new JK.AccountProfileSamples(JK.app);
+ var accountProfileSamples = new JK.AccountProfileSamples(JK.app, null)
accountProfileSamples.initialize();
var accountAudioProfile = new JK.AccountAudioProfile(JK.app);
diff --git a/web/app/views/landings/affiliate_program.html.slim b/web/app/views/landings/affiliate_program.html.slim
new file mode 100644
index 000000000..34859ff76
--- /dev/null
+++ b/web/app/views/landings/affiliate_program.html.slim
@@ -0,0 +1,56 @@
+- provide(:page_name, 'landing_page full landing_product affiliate_program')
+- provide(:description, 'Signup for JamKazam Affiliate Program')
+
+.row
+ .column
+ h1.product-headline JamKazam Affiliate Program
+ p Do you have a following of musicians on Facebook, YouTube, Twitter or an email list? Generate income simply by letting them know about JamKazam.
+ p Let's say you make YouTube tutorial videos. You can link directly from a video on how to play "Back in Black" to our JamTrack for that song. Video watchers can get this first JamTrack free, and can buy others if they like. You get paid every time they buy something from us for 2 years.
+ p Or let's say you have a Facebook group for guitarist with 5,000 members. You can let them know they can play together free on JamKazam. For everyone who signs up, you get paid every time they buy something from us for 2 years.
+ p You don't have to sell anything. Just let your followers know about cool new stuff they'll like! To get started, simply review the affiliate agreement below, accept it (at the end of the agreement), and then start sharing links with your affiliate code. When referred users buy JamTracks, JamBlasters, JamLessons, and so on, you get paid!
+ .column
+ h1 Learn How to Make Money by Referring Users
+ .video-wrapper
+ .video-container
+ iframe src="//www.youtube.com/embed/ylYcvTY9CVo" frameborder="0" allowfullscreen
+ br clear="all"
+.row
+ h1 JamKazam Affiliate Agreement
+ = render "legal/partner_agreement_v1"
+
+ p.agreement-notice By clicking the "I Agree" button below, I certify that I have the authority to enter into this Agreement on behalf of myself as an individual or on behalf of the entity I have listed below, and I further certify that I have read, understood, and agree to be bound by the terms above.
+ .entity-options
+ .field.radio
+ = radio_button_tag(:entity, 'individual')
+ label I am entering into this Agreement as an individual
+ .field.radio
+ = radio_button_tag(:entity, 'entity')
+ label I am executing this Agreement on behalf of the company or entity listed below
+
+ .entity-info.hidden
+ .field.entity.name
+ label Entity Name
+ input type="text" name="entity-name"
+ .field.entity.type
+ label Entity Type
+ select name="entity-type"
+ option value="" Choose Entity Type
+ option value="Sole Proprietor" Sole Proprietor
+ option value="Limited Liability Company (LLC)" Limited Liability Company (LLC)
+ option value="Partnership" Partnership
+ option value="Trust/Estate" Trust/Estate
+ option value="S Corporation" S Corporation
+ option value="C Corporation" C Corporation
+ option value="Other" Other
+
+ .agree-disagree-buttons
+ = link_to image_tag("content/agree_button.png", {:width => 213, :height => 50 }), '#', class: "agree-button"
+ = link_to image_tag("content/disagree_button.png", {:width => 213, :height => 50 }), '#', class: "disagree-button"
+ p.disagree-text.hidden
+ | Thank you for your interest in the JamKazam affiliate program. We are sorry, but you cannot join the program without consenting to the terms of this Agreement.
+
+javascript:
+ $(document).on('JAMKAZAM_READY', function(e, data) {
+ var affiliateProgram = new JK.AffiliateProgram(data.app);
+ affiliateProgram.initialize();
+ })
\ No newline at end of file
diff --git a/web/app/views/landings/individual_jamtrack.html.slim b/web/app/views/landings/individual_jamtrack.html.slim
index c3b6e9daa..cb1cfc771 100644
--- a/web/app/views/landings/individual_jamtrack.html.slim
+++ b/web/app/views/landings/individual_jamtrack.html.slim
@@ -1,5 +1,6 @@
- provide(:page_name, 'landing_page full landing_jamtrack individual_jamtrack')
- provide(:description, @jam_track.nil? ? nil : "Preview multi-track JamTrack recording: #{@jam_track.name} by #{@jam_track.original_artist}. Way better than a backing track.")
+- provide(:title, @jam_track.nil? ? nil : "Preview JamTrack: #{@jam_track.name} by #{@jam_track.original_artist}")
.one_by_two
.row
diff --git a/web/app/views/landings/individual_jamtrack_band.html.slim b/web/app/views/landings/individual_jamtrack_band.html.slim
index 88237cd56..9b2b72b19 100644
--- a/web/app/views/landings/individual_jamtrack_band.html.slim
+++ b/web/app/views/landings/individual_jamtrack_band.html.slim
@@ -1,5 +1,6 @@
- provide(:page_name, 'landing_page full landing_jamtrack individual_jamtrack_band')
- provide(:description, @jam_track.nil? ? nil : "Preview multi-track JamTrack recording: #{@jam_track.name} by #{@jam_track.original_artist}. Way better than a backing track.")
+- provide(:title, @jam_track.nil? ? nil : "Preview JamTrack: #{@jam_track.name} by #{@jam_track.original_artist}")
.one_by_two
.row
diff --git a/web/app/views/layouts/application.html.erb b/web/app/views/layouts/application.html.erb
index 378a7356c..0f988cd57 100644
--- a/web/app/views/layouts/application.html.erb
+++ b/web/app/views/layouts/application.html.erb
@@ -6,15 +6,6 @@
-
-
<%= stylesheet_link_tag "client/ie", media: "all" %>
<%= stylesheet_link_tag "client/jamkazam", media: "all" %>
@@ -32,10 +23,6 @@
<%= stylesheet_link_tag "client/search", media: "all" %>
<%= stylesheet_link_tag "client/ftue", media: "all" %>
<%= stylesheet_link_tag "client/createSession", media: "all" %>
- <% if bugsnag? %>
-
-
- <% end %>
<%= include_gon %>
<%= csrf_meta_tags %>
diff --git a/web/app/views/layouts/client.html.erb b/web/app/views/layouts/client.html.erb
index dd7d51a9b..6c234aba7 100644
--- a/web/app/views/layouts/client.html.erb
+++ b/web/app/views/layouts/client.html.erb
@@ -6,23 +6,8 @@
-
-
<%= stylesheet_link_tag "client/client", media: "all" %>
- <% if bugsnag? %>
-
-
- <% end %>
<%= include_gon %>
<%= javascript_include_tag "application" %>
<%= csrf_meta_tags %>
diff --git a/web/app/views/layouts/corporate.html.erb b/web/app/views/layouts/corporate.html.erb
index 763a78c93..1d1f31f41 100644
--- a/web/app/views/layouts/corporate.html.erb
+++ b/web/app/views/layouts/corporate.html.erb
@@ -2,24 +2,9 @@
<%= full_title(yield(:title)) %>
-
-
<%= stylesheet_link_tag "corp/corporate", :media => "all" %>
- <% if bugsnag? %>
-
-
- <% end %>
<%= include_gon(:init => true) %>
<%= javascript_include_tag "corp/corporate" %>
<%= csrf_meta_tags %>
diff --git a/web/app/views/layouts/landing.html.erb b/web/app/views/layouts/landing.html.erb
index f3b891b82..13f816530 100644
--- a/web/app/views/layouts/landing.html.erb
+++ b/web/app/views/layouts/landing.html.erb
@@ -6,23 +6,8 @@
-
-
<%= stylesheet_link_tag "landing/landing", media: "all" %>
- <% if bugsnag? %>
-
-
- <% end %>
<%= include_gon(:init => true) %>
<%= csrf_meta_tags %>
diff --git a/web/app/views/layouts/minimal.html.erb b/web/app/views/layouts/minimal.html.erb
index 37bf88c9e..411b792c5 100644
--- a/web/app/views/layouts/minimal.html.erb
+++ b/web/app/views/layouts/minimal.html.erb
@@ -6,23 +6,8 @@
-
-
<%= stylesheet_link_tag "minimal/minimal", media: "all" %>
- <% if bugsnag? %>
-
-
- <% end %>
<%= include_gon(:init => true) %>
<%= csrf_meta_tags %>
diff --git a/web/app/views/layouts/web.html.erb b/web/app/views/layouts/web.html.erb
index f64eb8d59..19f8fd91b 100644
--- a/web/app/views/layouts/web.html.erb
+++ b/web/app/views/layouts/web.html.erb
@@ -6,23 +6,8 @@
-
-
<%= stylesheet_link_tag "web/web", media: "all" %>
- <% if bugsnag? %>
-
-
- <% end %>
<%= include_gon(:init => true) %>
<%= csrf_meta_tags %>
diff --git a/web/app/views/legal/_partner_agreement_v1.html.erb b/web/app/views/legal/_partner_agreement_v1.html.erb
new file mode 100644
index 000000000..1dbc81472
--- /dev/null
+++ b/web/app/views/legal/_partner_agreement_v1.html.erb
@@ -0,0 +1,422 @@
+
+
+
+
Updated: April 30, 2015.
+
+
+
+
+ This Affiliate Agreement (this “Agreement”) contains the terms and conditions that govern your participation in the JamKazam affiliate marketing program (the “Program”). “JamKazam”, “we,” “us,”
+ or “our”
+ means JamKazam, Inc. “You”
+ or “your”
+ means the applicant. A “site”
+ means a website. “JamKazam Site” means the jamkazam.com website or a JamKazam applicaion or any other site that is owned or operated by or on behalf of us and which is identified as participating in the Program in the Program Advertising Fee Schedule in Section 10, as applicable. “Your Site”
+ means any site(s), software application(s), or content that you create, own, or operate and link to the JamKazam Site.
+
+
+
+
+
1. Description of the Program
+
+
+
+
+ The purpose of the Program is to permit you to advertise Products on Your Site and to earn advertising fees for Qualifying Purchases (defined in Section 7) made by your Qualifying Customers (defined in Section 7). A “Product”
+ is an item sold on the JamKazam Site and listed in the Program Advertising Fee Schedule in Section 10. In order to facilitate your advertisement of Products, we may make available to you data, images, text, link formats, widgets, links, and other linking tools, and other information in connection with the Program (“Content”).
+
+
+
+
+
2. Enrollment, Suitability, and Communications
+
+
+
+
To enroll in the Program, you must execute this Agreement by clicking the “I Agree”
+ button at the end of this Agreement, after having thoroughly reviewed the Agreement.
+
+
+
+
+ Your Site may be considered unsuitable for participation in the Program resulting in termination of this Agreement by JamKazam if Your Site:
+
+
+
+
+ - promotes or contains sexually explicit materials;
+ - promotes violence or contains violent materials;
+ - promotes or contains libelous or defamatory materials;
+ -
+ promotes discrimination, or employs discriminatory practices, based on race, sex, religion, nationality, disability, sexual orientation, or age;
+
+ - promotes or undertakes illegal activities;
+ -
+ is directed toward children under 13 years of age, as defined by the Children’s Online Privacy Protection Act (15 U.S.C. §§
+ 6501-6506) and any regulations promulgated thereunder;
+ -
+ includes any trademark of JamKazam or a variant or misspelling of a trademark of JamKazam in any domain name, subdomain name, or in any username, group name, or other identifier on any social networking site; or
+
+ - otherwise violates intellectual property rights.
+
+
+
+
+ You will ensure that the information you provide in executing this Agreement and otherwise associated with your account, including your name, email address, mailing address, tax ID, and other information, is at all times complete, accurate, and up-to-date. We may send notifications (if any), reports (if any), and other communications relating to the Program and this Agreement to the email address then-currently associated with your JamKazam account. You will be deemed to have received all notifications, reports, and other communications sent to that email address, even if the email address associated with your account is no longer current. We may mail checks (if any) payable to you for advertising fees earned under this Agreement to the mailing address then-currently associated with your JamKazam account. You will be deemed to have received all checks sent to that mailing address, even if the mailing address associated with your account is no longer current. If we send a check to a mailing address that is no longer valid, we may, in our sole discretion, choose to issue a stop payment order for such a check and send a new check to a new current address that your provide, but in such a case, we will charge a US$50.00 fee for this exception process.
+
+
+
+
+
+ If you are a Non-US person participating in the Program, you agree that you will perform all services under the Agreement outside the United States.
+
+
+
+
+
3. Links on Your Site
+
+
+
+
+ After you have entered into this Agreement, you may display Special Links on Your Site. “Special Links”
+ are links to the JamKazam Site that you place on Your Site in accordance with this Agreement, that properly utilize the special “tagged”
+ link formats we specify or provide. Special Links permit accurate tracking, reporting, and accrual of advertising fees.
+
+
+
+
+
+ You may earn advertising fees only as described in Section 7 and only with respect to activity on the JamKazam Site occurring directly through Special Links. We will have no obligation to pay you advertising fees if you fail to properly format the links on Your Site to the JamKazam Site as Special Links, including to the extent that such failure may result in any reduction of advertising fee amounts that would otherwise be paid to you under this Agreement.
+
+
+
+
+
4. Program Requirements
+
+
+
+
You hereby consent to us:
+
+
+
+ - sending you emails relating to the Program from time to time; and
+ -
+ monitoring, recording, using, and disclosing information about Your Site and visitors to Your Site that we obtain in connection with your display of Special Links in accordance with the JamKazam Privacy Policy.
+
+
+
+
+
5. Responsibility for Your Site
+
+
+
+
+ You will be solely responsible for Your Site including its development, operation, and maintenance, and all materials that appear on or within it. For example, you will be solely responsible for:
+
+
+
+
+ - the technical operation of Your Site and all related equipment;
+ -
+ displaying Special Links and Content on Your Site in compliance with this Agreement and any agreement between you and any other person or entity (including any restrictions or requirements placed on you by any person or entity that hosts Your Site);
+
+ -
+ creating and posting, and ensuring the accuracy, completeness, and appropriateness of, materials posted on Your Site (including all Product descriptions and other Product-related materials and any information you include within or associate with Special Links);
+
+ -
+ using the Content, Your Site, and the materials on or within Your Site in a manner that does not infringe, violate, or misappropriate any of our rights or those of any other person or entity (including copyrights, trademarks, privacy, publicity or other intellectual property or proprietary rights);
+
+ -
+ disclosing on Your Site accurately and adequately, either through a privacy policy or otherwise, how you collect, use, store, and disclose data collected from visitors, including, where applicable, that third parties (including us and other advertisers) may serve content and advertisements, collect information directly from visitors, and place or recognize cookies on visitors’
+ browsers; and
+ -
+ any use that you make of the Content and the JamKazam Marks, whether or not permitted under this Agreement.
+
+
+
+
+
+ We will have no liability for these matters or for any of your end users’ claims relating to these matters, and you agree to defend, indemnify, and hold us, our affiliates and licensors, and our and their respective employees, officers, directors, and representatives, harmless from and against all claims, damages, losses, liabilities, costs, and expenses (including attorneys’
+ fees) relating to (a) Your Site or any materials that appear on Your Site, including the combination of Your Site or those materials with other applications, content, or processes; (b) the use, development, design, manufacture, production, advertising, promotion, or marketing of Your Site or any materials that appear on or within Your Site, and all other matters described in this Section 5; (c) your use of any Content, whether or not such use is authorized by or violates this Agreement or any applicable law; (d) your violation of any term or condition of this Agreement; or (e) your or your employees' negligence or willful misconduct.
+
+
+
+
+
6. Order Processing
+
+
+
+
+ We will process Product orders placed by Qualifying Customers (defined in Section 7) on the JamKazam Site. We reserve the right to reject orders that do not comply with any requirements on the JamKazam Site, as they may be updated from time to time. We will track Qualifying Purchases (defined in Section 7) for reporting and advertising fee accrual purposes and will make available to you reports summarizing those Qualifying Purchases.
+
+
+
+
+
7. Advertising Fees
+
+
+
+
+ We will pay you advertising fees on Qualifying Purchases in accordance with Section 8 and the Program Advertising Fee Schedule in Section 10. Subject to the exclusions set forth below, a “Qualifying Purchase”
+ occurs when a Qualifying Customer: (a) purchases a Product within two (2) years of the date on which such Qualifying Customer registered to create his/her JamKazam account; and (b) pays for such Product. A “Qualifying Customer”
+ is an end user who: (a) clicks through a Special Link on Your Site to the JamKazam Site; and (b) during the single Session created by this click through, registers to create a new JamKazam account. A “Session”
+ begins when an end user clicks through a Special Link on Your Site to the JamKazam Site and ends when such end user leaves the JamKazam Site.
+
+
+
+
+
+ Qualifying Purchases exclude, and we will not pay advertising fees on any of, the following:
+
+
+
+
+ -
+ any Product purchase that is not correctly tracked or reported because the links from Your Site to the JamKazam Site are not properly formatted;
+
+ -
+ any Product purchased through a Special Link by you or on your behalf, including Products you purchase through Special Links for yourself, friends, relatives, or associates;
+
+ -
+ any Product purchased through a Special Link that violates the terms of this Agreement;
+
+ - any Product order that is canceled or returned;
+ - any Product purchase that becomes classified as bad debt; or
+ -
+ any Product purchase for which we process a promotional discount against the transaction that makes such Product free.
+
+
+
+
+
8. Advertising Fee Payment
+
+
+
+
+ We will pay you advertising fees on a quarterly basis for Qualifying Purchases downloaded, shipped, or otherwise fulfilled (as applicable) in a given calendar quarter, subject to any applicable withholding or deduction described below. We will pay you approximately 30 days following the end of each calendar quarter by mailing a check in the amount of the advertising fees you earn to the mailing address then-currently associated with your JamKazam account, but we may accrue and withhold payment of advertising fees until the total amount due to you is at least US$50.00. If you do not have a valid mailing address associated with your JamKazam account within 30 days of the end of a calendar quarter, we will withhold any unpaid accrued advertising fees until you have associated a valid mailing address and notified us that you have done so.
+
+
+
+
+
+ Further, any unpaid accrued advertising fees in your account may be subject to escheatment under state law. We may be obligated by law to obtain tax information from you if you are a U.S. citizen, U.S. resident, or U.S. corporation, or if your business is otherwise taxable in the U.S. If we request tax information from you and you do not provide it to us, we may (in addition to any other rights or remedies available to us) withhold your advertising fees until you provide this information or otherwise satisfy us that you are not a person from whom we are required to obtain tax information.
+
+
+
+
+
9. Policies and Pricing
+
+
+
+
+ Qualifying Customers who buy Products through this Program are our customers with respect to all activities they undertake in connection with the JamKazam Site. Accordingly, as between you and us, all pricing, terms of sale, rules, policies, and operating procedures concerning customer orders, customer service, and product sales set forth on the JamKazam Site will apply to such Qualifying Customers, and we may change them at any time in our sole discretion.
+
+
+
+
+
10. Program Advertising Fee Schedule
+
+
+
+
+ We will determine and calculate amounts payable to you as advertising fees for Qualifying Purchases as set forth in the table below (the “Program Advertising Fee Schedule”).
+
+
+
+
+
+
+
+ Product |
+ Advertising Fees |
+
+
+ JamTracks |
+
+ We will pay advertising fees of US$0.20 per JamTrack sold as a Qualifying Purchase.
+ |
+
+
+
+
+
+
+ From time to time, we may modify this Program Advertising Fee Schedule as part of modifications made to this Agreement.
+
+
+
+
+
11. Limited License
+
+
+
+
+ Subject to the terms of this Agreement and solely for the limited purposes of advertising Products on, and directing end users to, the JamKazam Site in connection with the Program, we hereby grant you a limited, revocable, non-transferable, non-sublicensable, non-exclusive, royalty-free license to (a) copy and display the Content solely on Your Site; and (b) use only those of our trademarks and logos that we may make available to you as part of Content (those trademarks and logos, collectively, “JamKazam Marks”) solely on Your Site.
+
+
+
+
+
+ The license set forth in this Section 11 will immediately and automatically terminate if at any time you do not timely comply with any obligation under this Agreement, or otherwise upon termination of this Agreement. In addition, we may terminate the license set forth in this Section 11 in whole or in part upon written notice to you. You will promptly remove from Your Site and delete or otherwise destroy all of the Content and JamKazam Marks with respect to which the license set forth in this Section 11 is terminated or as we may otherwise request from time to time.
+
+
+
+
+
12. Reservation of Rights; Submissions
+
+
+
+
+ Other than the limited licenses expressly set forth in Section 11, we reserve all right, title and interest (including all intellectual property and proprietary rights) in and to, and you do not, by virtue of this Agreement or otherwise, acquire any ownership interest or rights in or to, the Program, Special Links, Content, Products, any domain name owned or operated by us, our trademarks and logos (including the JamKazam Marks), and any other intellectual property and technology that we provide or use in connection with the Program (including any application program interfaces, software development kits, libraries, sample code, and related materials). If you provide us with suggestions, reviews, modifications, data, images, text, or other information or content about a Product or in connection with this Agreement, any Content, or your participation in the Program, or if you modify any Content in any way, (collectively, “Your Submission”), you hereby irrevocably assign to us all right, title, and interest in and to Your Submission and grant us (even if you have designated Your Submission as confidential) a perpetual, paid-up royalty-free, nonexclusive, worldwide, irrevocable, freely transferable right and license to (a) use, reproduce, perform, display, and distribute Your Submission in any manner; (b) adapt, modify, re-format, and create derivative works of Your Submission for any purpose; (c) use and publish your name in the form of a credit in conjunction with Your Submission (however, we will not have any obligation to do so); and (d) sublicense the foregoing rights to any other person or entity. Additionally, you hereby warrant that: (y) Your Submission is your original work, or you obtained Your Submission in a lawful manner; and (z) our and our sublicensees’
+ exercise of rights under the license above will not violate any person’s or entity’s rights, including any copyright rights. You agree to provide us such assistance as we may require to document, perfect, or maintain our rights in and to Your Submission.
+
+
+
+
+
13. Compliance with Laws
+
+
+
+
+ In connection with your participation in the Program you will comply with all applicable laws, ordinances, rules, regulations, orders, licenses, permits, judgments, decisions, and other requirements of any governmental authority that has jurisdiction over you, including laws (federal, state, or otherwise) that govern marketing email (e.g., the CAN-SPAM Act of 2003).
+
+
+
+
+
14. Term and Termination
+
+
+
+
+ The term of this Agreement will begin upon your execution of this Agreement by clicking the “I Agree”
+ button at the end of this Agreement, only if such execution is processed and confirmed successfully by the JamKazam Site, and will end when terminated by either you or us. Either you or we may terminate this Agreement at any time, with or without cause, by giving the other party written notice of termination. Upon any termination of this Agreement, any and all licenses you have with respect to Content will automatically terminate, and you will immediately stop using the Content and JamKazam Marks and promptly remove from Your Site and delete or otherwise destroy all links to the JamKazam Site, all JamKazam Marks, all other Content, and any other materials provided or made available by or on behalf of us to you under this Agreement or otherwise in connection with the Program. We may withhold accrued unpaid advertising fees for a reasonable period of time following termination to ensure that the correct amount is paid (e.g., to account for any cancelations or returns). Upon any termination of this Agreement, all rights and obligations of the parties will be extinguished, except that the rights and obligations of the parties under Sections 5, 9, 12, 13, 14, 16, 17, 18, 19, and 20, together with any of our payment obligations that accrue in accordance with Sections 6, 7, 8, and 10 following the termination of this Agreement, will survive the termination of this Agreement. No termination of this Agreement will relieve either party for any liability for any breach of, or liability accruing under, this Agreement prior to termination.
+
+
+
+
+
15. Modification
+
+
+
+
+ We may modify any of the terms and conditions contained in this Agreement at any time and in our sole discretion by posting a change notice or revised agreement on the JamKazam Site or by sending notice of such modification to you by email to the email address then-currently associated with your JamKazam account (any such change by email will be effective on the date specified in such email and will in no event be less than two business days after the date the email is sent). Modifications may include, for example, changes to the Program Advertising Fee Schedule, payment procedures, and other Program requirements. IF ANY MODIFICATION IS UNACCEPTABLE TO YOU, YOUR ONLY RECOURSE IS TO TERMINATE THIS AGREEMENT. YOUR CONTINUED PARTICIPATION IN THE PROGRAM FOLLOWING THE EFFECTIVE DATE OF ANY MODIFICATION (E.G., THE DATE OF OUR POSTING OF A CHANGE NOTICE OR REVISED AGREEMENT ON THE JAMKAZAM SITE OR THE DATE SPECIFIED IN ANY EMAIL TO YOU REGARDING SUCH MODIFICATION) WILL CONSTITUTE YOUR BINDING ACCEPTANCE OF THE CHANGE.
+
+
+
+
+
16. Relationship of Parties
+
+
+
+
+ You and we are independent contractors, and nothing in this Agreement will create any partnership, joint venture, agency, franchise, sales representative, or employment relationship between you and us or our respective affiliates. You will have no authority to make or accept any offers or representations on our behalf. You will not make any statement, whether on Your Site or otherwise, that contradicts or may contradict anything in this section. If you authorize, assist, encourage, or facilitate another person or entity to take any action related to the subject matter of this Agreement, you will be deemed to have taken the action yourself.
+
+
+
+
+
17. Limitation of Liability
+
+
+
+
+ WE WILL NOT BE LIABLE FOR INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL, OR EXEMPLARY DAMAGES (INCLUDING ANY LOSS OF REVENUE, PROFITS, GOODWILL, USE, OR DATA) ARISING IN CONNECTION WITH THIS AGREEMENT, THE PROGRAM, THE JAMKAZAM SITE, OR THE SERVICE OFFERINGS (DEFINED BELOW), EVEN IF WE HAVE BEEN ADVISED OF THE POSSIBILITY OF THOSE DAMAGES. FURTHER, OUR AGGREGATE LIABILITY ARISING IN CONNECTION WITH THIS AGREEMENT, THE PROGRAM, THE JAMKAZAM SITE, AND THE SERVICE OFFERINGS WILL NOT EXCEED THE TOTAL ADVERTISING FEES PAID OR PAYABLE TO YOU UNDER THIS AGREEMENT IN THE TWELVE MONTHS IMMEDIATELY PRECEDING THE DATE ON WHICH THE EVENT GIVING RISE TO THE MOST RECENT CLAIM OF LIABILITY OCCURRED.
+
+
+
+
+
18. Disclaimers
+
+
+
+
+ THE PROGRAM, THE JAMKAZAM SITE, ANY PRODUCTS AND SERVICES OFFERED ON THE JAMKAZAM SITE, ANY SPECIAL LINKS, LINK FORMATS, CONTENT, JAMKAZAM.COM DOMAIN NAME, OUR TRADEMARKS AND LOGOS (INCLUDING THE JAMKAZAM MARKS), AND ALL TECHNOLOGY, SOFTWARE, FUNCTIONS, MATERIALS, DATA, IMAGES, TEXT, AND OTHER INFORMATION AND CONTENT PROVIDED OR USED BY OR ON BEHALF OF US OR LICENSORS IN CONNECTION WITH THE PROGRAM (COLLECTIVELY THE “SERVICE OFFERINGS”) ARE PROVIDED “AS IS.”
+ NEITHER WE NOR ANY OF OUR LICENSORS MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND, WHETHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO THE SERVICE OFFERINGS. EXCEPT TO THE EXTENT PROHIBITED BY APPLICABLE LAW, WE AND OUR LICENSORS DISCLAIM ALL WARRANTIES WITH RESPECT TO THE SERVICE OFFERINGS, INCLUDING ANY IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND QUIET ENJOYMENT, AND ANY WARRANTIES ARISING OUT OF ANY COURSE OF DEALING, PERFORMANCE, OR TRADE USAGE. WE MAY DISCONTINUE ANY SERVICE OFFERING, OR MAY CHANGE THE NATURE, FEATURES, FUNCTIONS, SCOPE, OR OPERATION OF ANY SERVICE OFFERING, AT ANY TIME AND FROM TIME TO TIME. NEITHER WE NOR ANY OF OUR LICENSORS WARRANT THAT THE SERVICE OFFERINGS WILL CONTINUE TO BE PROVIDED, WILL FUNCTION AS DESCRIBED, CONSISTENTLY OR IN ANY PARTICULAR MANNER, OR WILL BE UNINTERRUPTED, ACCURATE, ERROR FREE, OR FREE OF HARMFUL COMPONENTS. NEITHER WE NOR ANY OF OUR LICENSORS WILL BE RESPONSIBLE FOR (A) ANY ERRORS, INACCURACIES, OR SERVICE INTERRUPTIONS, INCLUDING POWER OUTAGES OR SYSTEM FAILURES; OR (B) ANY UNAUTHORIZED ACCESS TO OR ALTERATION OF, OR DELETION, DESTRUCTION, DAMAGE, OR LOSS OF, YOUR SITE OR ANY DATA, IMAGES, TEXT, OR OTHER INFORMATION OR CONTENT. NO ADVICE OR INFORMATION OBTAINED BY YOU FROM US OR FROM ANY OTHER PERSON OR ENTITY OR THROUGH THE PROGRAM, CONTENT, OR THE JAMKAZAM SITE WILL CREATE ANY WARRANTY NOT EXPRESSLY STATED IN THIS AGREEMENT. FURTHER, NEITHER WE NOR ANY OF OUR LICENSORS WILL BE RESPONSIBLE FOR ANY COMPENSATION, REIMBURSEMENT, OR DAMAGES ARISING IN CONNECTION WITH (X) ANY LOSS OF PROSPECTIVE PROFITS OR REVENUE, ANTICIPATED SALES, GOODWILL, OR OTHER BENEFITS, (Y) ANY INVESTMENTS, EXPENDITURES, OR COMMITMENTS BY YOU IN CONNECTION WITH THIS AGREEMENT OR YOUR PARTICIPATION IN THE PROGRAM, OR (Z) ANY TERMINATION OF THIS AGREEMENT OR YOUR PARTICIPATION IN THE PROGRAM.
+
+
+
+
+
19. Disputes
+
+
+
+
+ Any dispute relating in any way to the Program or this Agreement will be resolved by binding arbitration, rather than in court, except that you may assert claims in small claims court if your claims qualify. The Federal Arbitration Act and federal arbitration law and the laws of the state of Texas, without regard to principles of conflict of laws, will govern this Agreement and any dispute of any sort that might arise between you and us.
+
+
+
+
+
+ There is no judge or jury in arbitration, and court review of an arbitration award is limited. However, an arbitrator can award on an individual basis the same damages and relief as a court (including injunctive and declaratory relief or statutory damages), and must follow the terms of this Agreement as a court would.
+
+
+
+
+
+ To begin an arbitration proceeding, you must send a letter requesting arbitration and describing your claim to us at: JamKazam, Inc., Attn: Legal Department, 5813 Lookout Mountain Drive, Austin TX 78731. The arbitration will be conducted by the American Arbitration Association (“AAA”) under its rules, including the AAA’s Supplementary Procedures for Consumer-Related Disputes. The AAA’s rules are available at www.adr.org or by calling 1-800-778-7879. Payment of all filing, administration and arbitrator fees will be governed by the AAA’s rules. We will reimburse those fees for claims totaling less than $10,000 unless the arbitrator determines the claims are frivolous. Likewise, we will not seek attorneys’
+ fees and costs in arbitration unless the arbitrator determines the claims are frivolous. You may choose to have the arbitration conducted by telephone, based on written submissions, or in person in the county where you live or at another mutually agreed location.
+
+
+
+
+
+ We each agree that any dispute resolution proceedings will be conducted only on an individual basis and not in a class, consolidated or representative action. If for any reason a claim proceeds in court rather than in arbitration, we each waive any right to a jury trial. We also both agree that you or we may bring suit in court to enjoin infringement or other misuse of intellectual property rights.
+
+
+
+
+
+ Notwithstanding anything to the contrary in this Agreement, we may seek injunctive or other relief in any state, federal, or national court of competent jurisdiction for any actual or alleged infringement of our or any other person or entity’s intellectual property or proprietary rights. You further acknowledge and agree that our rights in the Content are of a special, unique, extraordinary character, giving them peculiar value, the loss of which cannot be readily estimated or adequately compensated for in monetary damages.
+
+
+
+
+
20. Miscellaneous
+
+
+
+
+ You acknowledge and agree that we may at any time (directly or indirectly) solicit customer referrals on terms that may differ from those contained in this Agreement or operate sites that are similar to or compete with Your Site. You may not assign this Agreement, by operation of law or otherwise, without our express prior written approval. Subject to that restriction, this Agreement will be binding on, inure to the benefit of, and be enforceable against the parties and their respective successors and assigns. Our failure to enforce your strict performance of any provision of this Agreement will not constitute a waiver of our right to subsequently enforce such provision or any other provision of this Agreement. Whenever used in this Agreement, the terms “include(s),” “including,” “e.g.,”
+ and “for example” mean, respectively, “include(s), without limitation,” “including, without limitation,” “e.g., without limitation,”
+ and “for example, without limitation.” Any determinations or updates that may be made by us, any actions that may be taken by us, and any approvals that may be given by us under this Agreement, may be made, taken, or given in our sole discretion.
+
+
+
+
+
+
+
+ BY CLICKING THE "I AGREE" BUTTON BELOW, YOU AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT, OR BY CONTINUING TO PARTICIPATE IN THE PROGRAM FOLLOWING OUR POSTING OF A CHANGE NOTICE OR REVISED AGREEMENT ON THE JAMKAZAM.COM SITE, YOU (A) AGREE TO BE BOUND BY THIS AGREEMENT; (B) ACKNOWLEDGE AND AGREE THAT YOU HAVE INDEPENDENTLY EVALUATED THE DESIRABILITY OF PARTICIPATING IN THE PROGRAM AND ARE NOT RELYING ON ANY REPRESENTATION, GUARANTEE, OR STATEMENT OTHER THAN AS EXPRESSLY SET FORTH IN THIS AGREEMENT; AND (C) HEREBY REPRESENT AND WARRANT THAT YOU ARE LAWFULLY ABLE TO ENTER INTO CONTRACTS (E.G., YOU ARE NOT A MINOR) AND THAT YOU ARE AND WILL REMAIN IN COMPLIANCE WITH THIS AGREEMENT. IN ADDITION, IF THIS AGREEMENT IS BEING AGREED TO BY A COMPANY OR OTHER LEGAL ENTITY, THEN THE PERSON AGREEING TO THIS AGREEMENT ON BEHALF OF THAT COMPANY OR ENTITY HEREBY REPRESENTS AND WARRANTS THAT HE OR SHE IS AUTHORIZED AND LAWFULLY ABLE TO BIND THAT COMPANY OR ENTITY TO THIS AGREEMENT.
+
+
+
+
+
+ JamKazam Confidential 4/17/2015
+
+
\ No newline at end of file
diff --git a/web/app/views/legal/partner_agreement_full.html.erb b/web/app/views/legal/partner_agreement_full.html.erb
new file mode 100644
index 000000000..1c6203aef
--- /dev/null
+++ b/web/app/views/legal/partner_agreement_full.html.erb
@@ -0,0 +1,5062 @@
+
+2015-04 JamKazam Affiliate Agreement v2.docx
+
+
+
+
+
+JamKazam Affiliate Agreement
+
+Updated: April 30, 2015.
+
+
+
+
+ This Affiliate Agreement (this “Agreement”) contains the terms and conditions that govern your participation in the JamKazam affiliate marketing program (the “Program”). “JamKazam”, “we,” “us,”
+ or “our”
+ means JamKazam, Inc. “You”
+ or “your”
+ means the applicant. A “site”
+ means a website. “JamKazam Site” means the jamkazam.com website or a JamKazam applicaion or any other site that is owned or operated by or on behalf of us and which is identified as participating in the Program in the Program Advertising Fee Schedule in Section 10, as applicable. “Your Site”
+ means any site(s), software application(s), or content that you create, own, or operate and link to the JamKazam Site.
+
+
+
+
+1. Description of the Program
+
+
+
+
+ The purpose of the Program is to permit you to advertise Products on Your Site and to earn advertising fees for Qualifying Purchases (defined in Section 7) made by your Qualifying Customers (defined in Section 7). A “Product”
+ is an item sold on the JamKazam Site and listed in the Program Advertising Fee Schedule in Section 10. In order to facilitate your advertisement of Products, we may make available to you data, images, text, link formats, widgets, links, and other linking tools, and other information in connection with the Program (“Content”).
+
+
+
+
+2. Enrollment, Suitability, and Communications
+
+
+
+To enroll in the Program, you must execute this Agreement by clicking the “I Agree”
+ button at the end of this Agreement, after having thoroughly reviewed the Agreement.
+
+
+
+
+ Your Site may be considered unsuitable for participation in the Program resulting in termination of this Agreement by JamKazam if Your Site:
+
+
+
+
+ - promotes or contains sexually explicit materials;
+ - promotes violence or contains violent materials;
+ - promotes or contains libelous or defamatory materials;
+ -
+ promotes discrimination, or employs discriminatory practices, based on race, sex, religion, nationality, disability, sexual orientation, or age;
+
+ - promotes or undertakes illegal activities;
+ -
+ is directed toward children under 13 years of age, as defined by the Children’s Online Privacy Protection Act (15 U.S.C. §§
+ 6501-6506) and any regulations promulgated thereunder;
+ -
+ includes any trademark of JamKazam or a variant or misspelling of a trademark of JamKazam in any domain name, subdomain name, or in any username, group name, or other identifier on any social networking site; or
+
+ - otherwise violates intellectual property rights.
+
+
+
+
+ You will ensure that the information you provide in executing this Agreement and otherwise associated with your account, including your name, email address, mailing address, tax ID, and other information, is at all times complete, accurate, and up-to-date. We may send notifications (if any), reports (if any), and other communications relating to the Program and this Agreement to the email address then-currently associated with your JamKazam account. You will be deemed to have received all notifications, reports, and other communications sent to that email address, even if the email address associated with your account is no longer current. We may mail checks (if any) payable to you for advertising fees earned under this Agreement to the mailing address then-currently associated with your JamKazam account. You will be deemed to have received all checks sent to that mailing address, even if the mailing address associated with your account is no longer current. If we send a check to a mailing address that is no longer valid, we may, in our sole discretion, choose to issue a stop payment order for such a check and send a new check to a new current address that your provide, but in such a case, we will charge a US$50.00 fee for this exception process.
+
+
+
+
+
+ If you are a Non-US person participating in the Program, you agree that you will perform all services under the Agreement outside the United States.
+
+
+
+
+3. Links on Your Site
+
+
+
+
+ After you have entered into this Agreement, you may display Special Links on Your Site. “Special Links”
+ are links to the JamKazam Site that you place on Your Site in accordance with this Agreement, that properly utilize the special “tagged”
+ link formats we specify or provide. Special Links permit accurate tracking, reporting, and accrual of advertising fees.
+
+
+
+
+
+ You may earn advertising fees only as described in Section 7 and only with respect to activity on the JamKazam Site occurring directly through Special Links. We will have no obligation to pay you advertising fees if you fail to properly format the links on Your Site to the JamKazam Site as Special Links, including to the extent that such failure may result in any reduction of advertising fee amounts that would otherwise be paid to you under this Agreement.
+
+
+
+
+4. Program Requirements
+
+
+
+You hereby consent to us:
+
+
+
+ - sending you emails relating to the Program from time to time; and
+ -
+ monitoring, recording, using, and disclosing information about Your Site and visitors to Your Site that we obtain in connection with your display of Special Links in accordance with the JamKazam Privacy Policy.
+
+
+
+
+5. Responsibility for Your Site
+
+
+
+
+ You will be solely responsible for Your Site including its development, operation, and maintenance, and all materials that appear on or within it. For example, you will be solely responsible for:
+
+
+
+
+ - the technical operation of Your Site and all related equipment;
+ -
+ displaying Special Links and Content on Your Site in compliance with this Agreement and any agreement between you and any other person or entity (including any restrictions or requirements placed on you by any person or entity that hosts Your Site);
+
+ -
+ creating and posting, and ensuring the accuracy, completeness, and appropriateness of, materials posted on Your Site (including all Product descriptions and other Product-related materials and any information you include within or associate with Special Links);
+
+ -
+ using the Content, Your Site, and the materials on or within Your Site in a manner that does not infringe, violate, or misappropriate any of our rights or those of any other person or entity (including copyrights, trademarks, privacy, publicity or other intellectual property or proprietary rights);
+
+ -
+ disclosing on Your Site accurately and adequately, either through a privacy policy or otherwise, how you collect, use, store, and disclose data collected from visitors, including, where applicable, that third parties (including us and other advertisers) may serve content and advertisements, collect information directly from visitors, and place or recognize cookies on visitors’
+ browsers; and
+ -
+ any use that you make of the Content and the JamKazam Marks, whether or not permitted under this Agreement.
+
+
+
+
+
+ We will have no liability for these matters or for any of your end users’ claims relating to these matters, and you agree to defend, indemnify, and hold us, our affiliates and licensors, and our and their respective employees, officers, directors, and representatives, harmless from and against all claims, damages, losses, liabilities, costs, and expenses (including attorneys’
+ fees) relating to (a) Your Site or any materials that appear on Your Site, including the combination of Your Site or those materials with other applications, content, or processes; (b) the use, development, design, manufacture, production, advertising, promotion, or marketing of Your Site or any materials that appear on or within Your Site, and all other matters described in this Section 5; (c) your use of any Content, whether or not such use is authorized by or violates this Agreement or any applicable law; (d) your violation of any term or condition of this Agreement; or (e) your or your employees' negligence or willful misconduct.
+
+
+
+
+6. Order Processing
+
+
+
+
+ We will process Product orders placed by Qualifying Customers (defined in Section 7) on the JamKazam Site. We reserve the right to reject orders that do not comply with any requirements on the JamKazam Site, as they may be updated from time to time. We will track Qualifying Purchases (defined in Section 7) for reporting and advertising fee accrual purposes and will make available to you reports summarizing those Qualifying Purchases.
+
+
+
+
+7. Advertising Fees
+
+
+
+
+ We will pay you advertising fees on Qualifying Purchases in accordance with Section 8 and the Program Advertising Fee Schedule in Section 10. Subject to the exclusions set forth below, a “Qualifying Purchase”
+ occurs when a Qualifying Customer: (a) purchases a Product within two (2) years of the date on which such Qualifying Customer registered to create his/her JamKazam account; and (b) pays for such Product. A “Qualifying Customer”
+ is an end user who: (a) clicks through a Special Link on Your Site to the JamKazam Site; and (b) during the single Session created by this click through, registers to create a new JamKazam account. A “Session”
+ begins when an end user clicks through a Special Link on Your Site to the JamKazam Site and ends when such end user leaves the JamKazam Site.
+
+
+
+
+
+ Qualifying Purchases exclude, and we will not pay advertising fees on any of, the following:
+
+
+
+
+ -
+ any Product purchase that is not correctly tracked or reported because the links from Your Site to the JamKazam Site are not properly formatted;
+
+ -
+ any Product purchased through a Special Link by you or on your behalf, including Products you purchase through Special Links for yourself, friends, relatives, or associates;
+
+ -
+ any Product purchased through a Special Link that violates the terms of this Agreement;
+
+ - any Product order that is canceled or returned;
+ - any Product purchase that becomes classified as bad debt; or
+ -
+ any Product purchase for which we process a promotional discount against the transaction that makes such Product free.
+
+
+
+
+8. Advertising Fee Payment
+
+
+
+
+ We will pay you advertising fees on a quarterly basis for Qualifying Purchases downloaded, shipped, or otherwise fulfilled (as applicable) in a given calendar quarter, subject to any applicable withholding or deduction described below. We will pay you approximately 30 days following the end of each calendar quarter by mailing a check in the amount of the advertising fees you earn to the mailing address then-currently associated with your JamKazam account, but we may accrue and withhold payment of advertising fees until the total amount due to you is at least US$50.00. If you do not have a valid mailing address associated with your JamKazam account within 30 days of the end of a calendar quarter, we will withhold any unpaid accrued advertising fees until you have associated a valid mailing address and notified us that you have done so.
+
+
+
+
+
+ Further, any unpaid accrued advertising fees in your account may be subject to escheatment under state law. We may be obligated by law to obtain tax information from you if you are a U.S. citizen, U.S. resident, or U.S. corporation, or if your business is otherwise taxable in the U.S. If we request tax information from you and you do not provide it to us, we may (in addition to any other rights or remedies available to us) withhold your advertising fees until you provide this information or otherwise satisfy us that you are not a person from whom we are required to obtain tax information.
+
+
+
+
+9. Policies and Pricing
+
+
+
+
+ Qualifying Customers who buy Products through this Program are our customers with respect to all activities they undertake in connection with the JamKazam Site. Accordingly, as between you and us, all pricing, terms of sale, rules, policies, and operating procedures concerning customer orders, customer service, and product sales set forth on the JamKazam Site will apply to such Qualifying Customers, and we may change them at any time in our sole discretion.
+
+
+
+
+10. Program Advertising Fee Schedule
+
+
+
+
+ We will determine and calculate amounts payable to you as advertising fees for Qualifying Purchases as set forth in the table below (the “Program Advertising Fee Schedule”).
+
+
+
+
+
+
+
+ Product |
+ Advertising Fees |
+
+
+ JamTracks |
+
+ We will pay advertising fees of US$0.20 per JamTrack sold as a Qualifying Purchase.
+ |
+
+
+
+
+
+
+ From time to time, we may modify this Program Advertising Fee Schedule as part of modifications made to this Agreement.
+
+
+
+
+11. Limited License
+
+
+
+
+ Subject to the terms of this Agreement and solely for the limited purposes of advertising Products on, and directing end users to, the JamKazam Site in connection with the Program, we hereby grant you a limited, revocable, non-transferable, non-sublicensable, non-exclusive, royalty-free license to (a) copy and display the Content solely on Your Site; and (b) use only those of our trademarks and logos that we may make available to you as part of Content (those trademarks and logos, collectively, “JamKazam Marks”) solely on Your Site.
+
+
+
+
+
+ The license set forth in this Section 11 will immediately and automatically terminate if at any time you do not timely comply with any obligation under this Agreement, or otherwise upon termination of this Agreement. In addition, we may terminate the license set forth in this Section 11 in whole or in part upon written notice to you. You will promptly remove from Your Site and delete or otherwise destroy all of the Content and JamKazam Marks with respect to which the license set forth in this Section 11 is terminated or as we may otherwise request from time to time.
+
+
+
+
+12. Reservation of Rights; Submissions
+
+
+
+
+ Other than the limited licenses expressly set forth in Section 11, we reserve all right, title and interest (including all intellectual property and proprietary rights) in and to, and you do not, by virtue of this Agreement or otherwise, acquire any ownership interest or rights in or to, the Program, Special Links, Content, Products, any domain name owned or operated by us, our trademarks and logos (including the JamKazam Marks), and any other intellectual property and technology that we provide or use in connection with the Program (including any application program interfaces, software development kits, libraries, sample code, and related materials). If you provide us with suggestions, reviews, modifications, data, images, text, or other information or content about a Product or in connection with this Agreement, any Content, or your participation in the Program, or if you modify any Content in any way, (collectively, “Your Submission”), you hereby irrevocably assign to us all right, title, and interest in and to Your Submission and grant us (even if you have designated Your Submission as confidential) a perpetual, paid-up royalty-free, nonexclusive, worldwide, irrevocable, freely transferable right and license to (a) use, reproduce, perform, display, and distribute Your Submission in any manner; (b) adapt, modify, re-format, and create derivative works of Your Submission for any purpose; (c) use and publish your name in the form of a credit in conjunction with Your Submission (however, we will not have any obligation to do so); and (d) sublicense the foregoing rights to any other person or entity. Additionally, you hereby warrant that: (y) Your Submission is your original work, or you obtained Your Submission in a lawful manner; and (z) our and our sublicensees’
+ exercise of rights under the license above will not violate any person’s or entity’s rights, including any copyright rights. You agree to provide us such assistance as we may require to document, perfect, or maintain our rights in and to Your Submission.
+
+
+
+
+13. Compliance with Laws
+
+
+
+
+ In connection with your participation in the Program you will comply with all applicable laws, ordinances, rules, regulations, orders, licenses, permits, judgments, decisions, and other requirements of any governmental authority that has jurisdiction over you, including laws (federal, state, or otherwise) that govern marketing email (e.g., the CAN-SPAM Act of 2003).
+
+
+
+
+14. Term and Termination
+
+
+
+
+ The term of this Agreement will begin upon your execution of this Agreement by clicking the “I Agree”
+ button at the end of this Agreement, only if such execution is processed and confirmed successfully by the JamKazam Site, and will end when terminated by either you or us. Either you or we may terminate this Agreement at any time, with or without cause, by giving the other party written notice of termination. Upon any termination of this Agreement, any and all licenses you have with respect to Content will automatically terminate, and you will immediately stop using the Content and JamKazam Marks and promptly remove from Your Site and delete or otherwise destroy all links to the JamKazam Site, all JamKazam Marks, all other Content, and any other materials provided or made available by or on behalf of us to you under this Agreement or otherwise in connection with the Program. We may withhold accrued unpaid advertising fees for a reasonable period of time following termination to ensure that the correct amount is paid (e.g., to account for any cancelations or returns). Upon any termination of this Agreement, all rights and obligations of the parties will be extinguished, except that the rights and obligations of the parties under Sections 5, 9, 12, 13, 14, 16, 17, 18, 19, and 20, together with any of our payment obligations that accrue in accordance with Sections 6, 7, 8, and 10 following the termination of this Agreement, will survive the termination of this Agreement. No termination of this Agreement will relieve either party for any liability for any breach of, or liability accruing under, this Agreement prior to termination.
+
+
+
+
+15. Modification
+
+
+
+
+ We may modify any of the terms and conditions contained in this Agreement at any time and in our sole discretion by posting a change notice or revised agreement on the JamKazam Site or by sending notice of such modification to you by email to the email address then-currently associated with your JamKazam account (any such change by email will be effective on the date specified in such email and will in no event be less than two business days after the date the email is sent). Modifications may include, for example, changes to the Program Advertising Fee Schedule, payment procedures, and other Program requirements. IF ANY MODIFICATION IS UNACCEPTABLE TO YOU, YOUR ONLY RECOURSE IS TO TERMINATE THIS AGREEMENT. YOUR CONTINUED PARTICIPATION IN THE PROGRAM FOLLOWING THE EFFECTIVE DATE OF ANY MODIFICATION (E.G., THE DATE OF OUR POSTING OF A CHANGE NOTICE OR REVISED AGREEMENT ON THE JAMKAZAM SITE OR THE DATE SPECIFIED IN ANY EMAIL TO YOU REGARDING SUCH MODIFICATION) WILL CONSTITUTE YOUR BINDING ACCEPTANCE OF THE CHANGE.
+
+
+
+
+16. Relationship of Parties
+
+
+
+
+ You and we are independent contractors, and nothing in this Agreement will create any partnership, joint venture, agency, franchise, sales representative, or employment relationship between you and us or our respective affiliates. You will have no authority to make or accept any offers or representations on our behalf. You will not make any statement, whether on Your Site or otherwise, that contradicts or may contradict anything in this section. If you authorize, assist, encourage, or facilitate another person or entity to take any action related to the subject matter of this Agreement, you will be deemed to have taken the action yourself.
+
+
+
+
+17. Limitation of Liability
+
+
+
+
+ WE WILL NOT BE LIABLE FOR INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL, OR EXEMPLARY DAMAGES (INCLUDING ANY LOSS OF REVENUE, PROFITS, GOODWILL, USE, OR DATA) ARISING IN CONNECTION WITH THIS AGREEMENT, THE PROGRAM, THE JAMKAZAM SITE, OR THE SERVICE OFFERINGS (DEFINED BELOW), EVEN IF WE HAVE BEEN ADVISED OF THE POSSIBILITY OF THOSE DAMAGES. FURTHER, OUR AGGREGATE LIABILITY ARISING IN CONNECTION WITH THIS AGREEMENT, THE PROGRAM, THE JAMKAZAM SITE, AND THE SERVICE OFFERINGS WILL NOT EXCEED THE TOTAL ADVERTISING FEES PAID OR PAYABLE TO YOU UNDER THIS AGREEMENT IN THE TWELVE MONTHS IMMEDIATELY PRECEDING THE DATE ON WHICH THE EVENT GIVING RISE TO THE MOST RECENT CLAIM OF LIABILITY OCCURRED.
+
+
+
+
+18. Disclaimers
+
+
+
+
+ THE PROGRAM, THE JAMKAZAM SITE, ANY PRODUCTS AND SERVICES OFFERED ON THE JAMKAZAM SITE, ANY SPECIAL LINKS, LINK FORMATS, CONTENT, JAMKAZAM.COM DOMAIN NAME, OUR TRADEMARKS AND LOGOS (INCLUDING THE JAMKAZAM MARKS), AND ALL TECHNOLOGY, SOFTWARE, FUNCTIONS, MATERIALS, DATA, IMAGES, TEXT, AND OTHER INFORMATION AND CONTENT PROVIDED OR USED BY OR ON BEHALF OF US OR LICENSORS IN CONNECTION WITH THE PROGRAM (COLLECTIVELY THE “SERVICE OFFERINGS”) ARE PROVIDED “AS IS.”
+ NEITHER WE NOR ANY OF OUR LICENSORS MAKE ANY REPRESENTATION OR WARRANTY OF ANY KIND, WHETHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO THE SERVICE OFFERINGS. EXCEPT TO THE EXTENT PROHIBITED BY APPLICABLE LAW, WE AND OUR LICENSORS DISCLAIM ALL WARRANTIES WITH RESPECT TO THE SERVICE OFFERINGS, INCLUDING ANY IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND QUIET ENJOYMENT, AND ANY WARRANTIES ARISING OUT OF ANY COURSE OF DEALING, PERFORMANCE, OR TRADE USAGE. WE MAY DISCONTINUE ANY SERVICE OFFERING, OR MAY CHANGE THE NATURE, FEATURES, FUNCTIONS, SCOPE, OR OPERATION OF ANY SERVICE OFFERING, AT ANY TIME AND FROM TIME TO TIME. NEITHER WE NOR ANY OF OUR LICENSORS WARRANT THAT THE SERVICE OFFERINGS WILL CONTINUE TO BE PROVIDED, WILL FUNCTION AS DESCRIBED, CONSISTENTLY OR IN ANY PARTICULAR MANNER, OR WILL BE UNINTERRUPTED, ACCURATE, ERROR FREE, OR FREE OF HARMFUL COMPONENTS. NEITHER WE NOR ANY OF OUR LICENSORS WILL BE RESPONSIBLE FOR (A) ANY ERRORS, INACCURACIES, OR SERVICE INTERRUPTIONS, INCLUDING POWER OUTAGES OR SYSTEM FAILURES; OR (B) ANY UNAUTHORIZED ACCESS TO OR ALTERATION OF, OR DELETION, DESTRUCTION, DAMAGE, OR LOSS OF, YOUR SITE OR ANY DATA, IMAGES, TEXT, OR OTHER INFORMATION OR CONTENT. NO ADVICE OR INFORMATION OBTAINED BY YOU FROM US OR FROM ANY OTHER PERSON OR ENTITY OR THROUGH THE PROGRAM, CONTENT, OR THE JAMKAZAM SITE WILL CREATE ANY WARRANTY NOT EXPRESSLY STATED IN THIS AGREEMENT. FURTHER, NEITHER WE NOR ANY OF OUR LICENSORS WILL BE RESPONSIBLE FOR ANY COMPENSATION, REIMBURSEMENT, OR DAMAGES ARISING IN CONNECTION WITH (X) ANY LOSS OF PROSPECTIVE PROFITS OR REVENUE, ANTICIPATED SALES, GOODWILL, OR OTHER BENEFITS, (Y) ANY INVESTMENTS, EXPENDITURES, OR COMMITMENTS BY YOU IN CONNECTION WITH THIS AGREEMENT OR YOUR PARTICIPATION IN THE PROGRAM, OR (Z) ANY TERMINATION OF THIS AGREEMENT OR YOUR PARTICIPATION IN THE PROGRAM.
+
+
+
+
+19. Disputes
+
+
+
+
+ Any dispute relating in any way to the Program or this Agreement will be resolved by binding arbitration, rather than in court, except that you may assert claims in small claims court if your claims qualify. The Federal Arbitration Act and federal arbitration law and the laws of the state of Texas, without regard to principles of conflict of laws, will govern this Agreement and any dispute of any sort that might arise between you and us.
+
+
+
+
+
+ There is no judge or jury in arbitration, and court review of an arbitration award is limited. However, an arbitrator can award on an individual basis the same damages and relief as a court (including injunctive and declaratory relief or statutory damages), and must follow the terms of this Agreement as a court would.
+
+
+
+
+
+ To begin an arbitration proceeding, you must send a letter requesting arbitration and describing your claim to us at: JamKazam, Inc., Attn: Legal Department, 5813 Lookout Mountain Drive, Austin TX 78731. The arbitration will be conducted by the American Arbitration Association (“AAA”) under its rules, including the AAA’s Supplementary Procedures for Consumer-Related Disputes. The AAA’s rules are available at www.adr.org or by calling 1-800-778-7879. Payment of all filing, administration and arbitrator fees will be governed by the AAA’s rules. We will reimburse those fees for claims totaling less than $10,000 unless the arbitrator determines the claims are frivolous. Likewise, we will not seek attorneys’
+ fees and costs in arbitration unless the arbitrator determines the claims are frivolous. You may choose to have the arbitration conducted by telephone, based on written submissions, or in person in the county where you live or at another mutually agreed location.
+
+
+
+
+
+ We each agree that any dispute resolution proceedings will be conducted only on an individual basis and not in a class, consolidated or representative action. If for any reason a claim proceeds in court rather than in arbitration, we each waive any right to a jury trial. We also both agree that you or we may bring suit in court to enjoin infringement or other misuse of intellectual property rights.
+
+
+
+
+
+ Notwithstanding anything to the contrary in this Agreement, we may seek injunctive or other relief in any state, federal, or national court of competent jurisdiction for any actual or alleged infringement of our or any other person or entity’s intellectual property or proprietary rights. You further acknowledge and agree that our rights in the Content are of a special, unique, extraordinary character, giving them peculiar value, the loss of which cannot be readily estimated or adequately compensated for in monetary damages.
+
+
+
+
+20. Miscellaneous
+
+
+
+
+ You acknowledge and agree that we may at any time (directly or indirectly) solicit customer referrals on terms that may differ from those contained in this Agreement or operate sites that are similar to or compete with Your Site. You may not assign this Agreement, by operation of law or otherwise, without our express prior written approval. Subject to that restriction, this Agreement will be binding on, inure to the benefit of, and be enforceable against the parties and their respective successors and assigns. Our failure to enforce your strict performance of any provision of this Agreement will not constitute a waiver of our right to subsequently enforce such provision or any other provision of this Agreement. Whenever used in this Agreement, the terms “include(s),” “including,” “e.g.,”
+ and “for example” mean, respectively, “include(s), without limitation,” “including, without limitation,” “e.g., without limitation,”
+ and “for example, without limitation.” Any determinations or updates that may be made by us, any actions that may be taken by us, and any approvals that may be given by us under this Agreement, may be made, taken, or given in our sole discretion.
+
+
+
+
+
+
+
+ BY CLICKING THE "I AGREE" BUTTON BELOW, YOU AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT, OR BY CONTINUING TO PARTICIPATE IN THE PROGRAM FOLLOWING OUR POSTING OF A CHANGE NOTICE OR REVISED AGREEMENT ON THE JAMKAZAM.COM SITE, YOU (A) AGREE TO BE BOUND BY THIS AGREEMENT; (B) ACKNOWLEDGE AND AGREE THAT YOU HAVE INDEPENDENTLY EVALUATED THE DESIRABILITY OF PARTICIPATING IN THE PROGRAM AND ARE NOT RELYING ON ANY REPRESENTATION, GUARANTEE, OR STATEMENT OTHER THAN AS EXPRESSLY SET FORTH IN THIS AGREEMENT; AND (C) HEREBY REPRESENT AND WARRANT THAT YOU ARE LAWFULLY ABLE TO ENTER INTO CONTRACTS (E.G., YOU ARE NOT A MINOR) AND THAT YOU ARE AND WILL REMAIN IN COMPLIANCE WITH THIS AGREEMENT. IN ADDITION, IF THIS AGREEMENT IS BEING AGREED TO BY A COMPANY OR OTHER LEGAL ENTITY, THEN THE PERSON AGREEING TO THIS AGREEMENT ON BEHALF OF THAT COMPANY OR ENTITY HEREBY REPRESENTS AND WARRANTS THAT HE OR SHE IS AUTHORIZED AND LAWFULLY ABLE TO BIND THAT COMPANY OR ENTITY TO THIS AGREEMENT.
+
+
+
+
+Radio buttons for:
+
+ - I am entering into this Agreement as an individual
+ -
+ I am executing this Agreement on behalf of the company or entity listed below
+
+
+
+
+ If the user clicks the entity radio button above, we display an Entity Name label and associated text entry box, and an Entity Type label with a drop down list box with the following options: Sole Proprietorship, Limited Liability Company (LLC), S Corporation, C Corporation, Partnership, Trust/Estate, and Other.
+
+
+
+
+
+ Green “I Agree” button on the left / centered. Red “I Do Not Agree” button on the right / centered.
+
+
+
+
+
+
+
+
+JamKazam Confidential 4/17/2015
+
+
+
\ No newline at end of file
diff --git a/web/app/views/shared/_facebook_sdk.html.slim b/web/app/views/shared/_facebook_sdk.html.slim
index f1ba82ae2..ff6de72df 100644
--- a/web/app/views/shared/_facebook_sdk.html.slim
+++ b/web/app/views/shared/_facebook_sdk.html.slim
@@ -1 +1 @@
-script src="https://apis.google.com/js/platform.js" async defer
\ No newline at end of file
+script src="https://apis.google.com/js/platform.js" async="async" defer="defer"
\ No newline at end of file
diff --git a/web/app/views/shared/_ga.html.erb b/web/app/views/shared/_ga.html.erb
index c4fb4d6a1..fd648c627 100644
--- a/web/app/views/shared/_ga.html.erb
+++ b/web/app/views/shared/_ga.html.erb
@@ -16,9 +16,9 @@
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
<% if Rails.env == "development" %>
- ga('create', '<%= Rails.application.config.ga_ua %>', { 'cookieDomain': 'none' });
+ ga('create', {'trackingId': '<%= Rails.application.config.ga_ua %>', 'siteSpeedSampleRate': 100, 'cookieDomain': 'none'});
<% else %>
- ga('create', '<%= Rails.application.config.ga_ua %>', 'jamkazam.com');
+ ga('create', {'trackingId': '<%= Rails.application.config.ga_ua %>', 'siteSpeedSampleRate': 50, 'cookieDomain': 'jamkazam.com'});
<% end %>
ga('require', 'displayfeatures');
ga('send', 'pageview', {
diff --git a/web/app/views/shared/_google_nocaptcha.html.slim b/web/app/views/shared/_google_nocaptcha.html.slim
index c0df3c331..c804c37b7 100644
--- a/web/app/views/shared/_google_nocaptcha.html.slim
+++ b/web/app/views/shared/_google_nocaptcha.html.slim
@@ -1 +1 @@
-script src="https://www.google.com/recaptcha/api.js" async defer
\ No newline at end of file
+script src="https://www.google.com/recaptcha/api.js" async="async" defer="defer"
\ No newline at end of file
diff --git a/web/app/views/shared/_recurly.html.slim b/web/app/views/shared/_recurly.html.slim
index d22bdabbd..7f566e136 100644
--- a/web/app/views/shared/_recurly.html.slim
+++ b/web/app/views/shared/_recurly.html.slim
@@ -1,4 +1 @@
-script src="https://js.recurly.com/v3/recurly.js"
-
-javascript:
- recurly.configure(gon.global.recurly_public_api_key)
\ No newline at end of file
+script src="https://js.recurly.com/v3/recurly.js" async="async" defer="defer"
\ No newline at end of file
diff --git a/web/app/views/users/new.html.erb b/web/app/views/users/new.html.erb
index f7b718af5..01fc14c25 100644
--- a/web/app/views/users/new.html.erb
+++ b/web/app/views/users/new.html.erb
@@ -145,7 +145,7 @@
-
+
<% end %>
diff --git a/web/config/application.rb b/web/config/application.rb
index 4de4e6d8c..1e61dc1ab 100644
--- a/web/config/application.rb
+++ b/web/config/application.rb
@@ -341,7 +341,12 @@ if defined?(Bundler)
config.remove_whitespace_credit_card = false
config.estimate_taxes = true
config.ad_sense_enabled = false
- config.guard_against_fraud = false
+ config.guard_against_fraud = true
config.error_on_fraud = false
+ config.expire_fingerprint_days = 14
+ config.found_conflict_count = 1
+ config.web_performance_timing_enabled = true
+ config.jamtrack_landing_bubbles_enabled = true
+ config.jamtrack_browser_bubbles_enabled = true
end
end
diff --git a/web/config/environments/test.rb b/web/config/environments/test.rb
index 920391264..a5b075118 100644
--- a/web/config/environments/test.rb
+++ b/web/config/environments/test.rb
@@ -108,5 +108,6 @@ SampleApp::Application.configure do
config.jam_tracks_available = true
config.video_available = "full"
config.guard_against_fraud = true
+ config.error_on_fraud = false
end
diff --git a/web/config/initializers/gon.rb b/web/config/initializers/gon.rb
index 2201a6833..587a89626 100644
--- a/web/config/initializers/gon.rb
+++ b/web/config/initializers/gon.rb
@@ -16,4 +16,8 @@ Gon.global.video_available = Rails.application.config.video_available
Gon.global.gear_check_ignore_high_latency = Rails.application.config.gear_check_ignore_high_latency
Gon.global.purchases_enabled = Rails.application.config.purchases_enabled
Gon.global.estimate_taxes = Rails.application.config.estimate_taxes
+Gon.global.web_performance_timing_enabled = Rails.application.config.web_performance_timing_enabled
+Gon.global.jamtrack_landing_bubbles_enabled = Rails.application.config.jamtrack_landing_bubbles_enabled
+Gon.global.jamtrack_browser_bubbles_enabled = Rails.application.config.jamtrack_browser_bubbles_enabled
+Gon.global.bugsnag_key = Rails.application.config.bugsnag_key
Gon.global.env = Rails.env
diff --git a/web/config/routes.rb b/web/config/routes.rb
index 016b0b9e4..5e1cfe434 100644
--- a/web/config/routes.rb
+++ b/web/config/routes.rb
@@ -32,6 +32,9 @@ SampleApp::Application.routes.draw do
match '/landing/kick4', to: 'landings#watch_overview_kick4', via: :get, as: 'landing_kick4'
match '/landing/jamtracks/:plan_code', to: 'landings#individual_jamtrack', via: :get, as: 'individual_jamtrack'
match '/landing/jamtracks/band/:plan_code', to: 'landings#individual_jamtrack_band', via: :get, as: 'individual_jamtrack_band'
+ match '/affiliateProgram', to: 'landings#affiliate_program', via: :get, as: 'affiliate_program'
+
+ match '/affiliate/links/:id', to: 'affiliates#links', via: :get, as: 'affilate_links'
# redirect /jamtracks to jamtracks browse page
get '/jamtracks', to: redirect('/client#/jamtrackBrowse')
@@ -390,6 +393,13 @@ SampleApp::Application.routes.draw do
match '/users/:id/plays' => 'api_users#add_play', :via => :post, :as => 'api_users_add_play'
match '/users/:id/affiliate' => 'api_users#affiliate_report', :via => :get, :as => 'api_users_affiliate'
+ match '/users/:id/affiliate_partner' => 'api_users#affiliate_partner', :via => [:get, :post], :as => 'api_users_affiliate_partner'
+
+ match '/affiliate_partners' => 'api_affiliate#create', :via => :post, :as => 'api_affiliates_create'
+ match '/affiliate_partners/signups' => 'api_affiliate#traffic_index', :via => :get, :as => 'api_affiliates_signups'
+ match '/affiliate_partners/monthly_earnings' => 'api_affiliate#monthly_index', :via => :get, :as => 'api_affiliates_monthly'
+ match '/affiliate_partners/quarterly_earnings' => 'api_affiliate#quarterly_index', :via => :get, :as => 'api_affiliates_quarterly'
+ match '/affiliate_partners/payments' => 'api_affiliate#payment_index', :via => :get, :as => 'api_affiliates_payment'
# downloads/uploads
match '/users/:id/syncs' => 'api_user_syncs#index', :via => :get
@@ -577,5 +587,13 @@ SampleApp::Application.routes.draw do
match '/signup_hints/:id' => 'api_signup_hints#show', :via => :get, :as => :api_signup_hint_detail
match '/alerts' => 'api_alerts#create', :via => :post
+
+ # links generated to help affiliates share relevant links
+ match '/links/jamtrack_songs' => 'api_links#jamtrack_song_index'
+ match '/links/jamtrack_bands' => 'api_links#jamtrack_band_index'
+ match '/links/jamtrack_general' => 'api_links#jamtrack_general_index'
+ match '/links/jamkazam' => 'api_links#jamkazam_general_index'
+ match '/links/sessions' => 'api_links#session_index'
+ match '/links/recordings' => 'api_links#recording_index'
end
end
diff --git a/web/config/scheduler.yml b/web/config/scheduler.yml
index fb899f1bf..1890a41d4 100644
--- a/web/config/scheduler.yml
+++ b/web/config/scheduler.yml
@@ -74,3 +74,8 @@ StatsMaker:
cron: "* * * * *"
class: "JamRuby::StatsMaker"
description: "Generates interesting stats from the database"
+
+TallyAffiliates:
+ cron: "0 0,4,8,12,16,20 * * *"
+ class: "JamRuby::TallyAffiliates"
+ description: "Tallies up affiliate totals"
diff --git a/web/db/schema.rb b/web/db/schema.rb
new file mode 100644
index 000000000..287f828b8
--- /dev/null
+++ b/web/db/schema.rb
@@ -0,0 +1,1752 @@
+# encoding: UTF-8
+# This file is auto-generated from the current state of the database. Instead
+# of editing this file, please use the migrations feature of Active Record to
+# incrementally modify your database, and then regenerate this schema definition.
+#
+# Note that this schema.rb definition is the authoritative source for your
+# database schema. If you need to create the application database on another
+# system, you should be using db:schema:load, not running all the migrations
+# from scratch. The latter is a flawed and unsustainable approach (the more migrations
+# you'll amass, the slower it'll run and the greater likelihood for issues).
+#
+# It's strongly recommended to check this file into your version control system.
+
+ActiveRecord::Schema.define(:version => 0) do
+
+ add_extension "fuzzystrmatch"
+ add_extension "postgis"
+ add_extension "postgis_tiger_geocoder"
+ add_extension "postgis_topology"
+ add_extension "tablefunc"
+ add_extension "uuid-ossp"
+
+ create_table "active_admin_comments", :force => true do |t|
+ t.string "resource_id", :null => false
+ t.string "resource_type", :null => false
+ t.integer "author_id"
+ t.string "author_type"
+ t.text "body"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.string "namespace"
+ end
+
+ add_index "active_admin_comments", ["author_type", "author_id"], :name => "index_active_admin_comments_on_author_type_and_author_id"
+ add_index "active_admin_comments", ["namespace"], :name => "index_active_admin_comments_on_namespace"
+ add_index "active_admin_comments", ["resource_type", "resource_id"], :name => "index_admin_comments_on_resource_type_and_resource_id"
+
+ create_table "active_music_sessions", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "user_id", :limit => 64, :null => false
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.string "claimed_recording_id", :limit => 64
+ t.string "claimed_recording_initiator_id", :limit => 64
+ t.integer "track_changes_counter", :default => 0
+ t.integer "jam_track_id", :limit => 8
+ t.string "jam_track_initiator_id", :limit => 64
+ t.string "backing_track_path", :limit => 1024
+ t.string "backing_track_initiator_id", :limit => 64
+ t.boolean "metronome_active", :default => false, :null => false
+ t.string "metronome_initiator_id", :limit => 64
+ end
+
+ create_table "addr", :primary_key => "gid", :force => true do |t|
+ t.integer "tlid", :limit => 8
+ t.string "fromhn", :limit => 12
+ t.string "tohn", :limit => 12
+ t.string "side", :limit => 1
+ t.string "zip", :limit => 5
+ t.string "plus4", :limit => 4
+ t.string "fromtyp", :limit => 1
+ t.string "totyp", :limit => 1
+ t.integer "fromarmid"
+ t.integer "toarmid"
+ t.string "arid", :limit => 22
+ t.string "mtfcc", :limit => 5
+ t.string "statefp", :limit => 2
+ end
+
+ add_index "addr", ["tlid", "statefp"], :name => "idx_tiger_addr_tlid_statefp"
+ add_index "addr", ["zip"], :name => "idx_tiger_addr_zip"
+
+# Could not dump table "addrfeat" because of following StandardError
+# Unknown type 'geometry' for column 'the_geom'
+
+ create_table "affiliate_partners", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "partner_name", :limit => 128, :null => false
+ t.string "partner_code", :limit => 128, :null => false
+ t.string "partner_user_id", :limit => 64, :null => false
+ t.string "user_email"
+ t.integer "referral_user_count", :default => 0, :null => false
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ add_index "affiliate_partners", ["partner_code"], :name => "affiliate_partners_code_idx"
+ add_index "affiliate_partners", ["partner_user_id"], :name => "affiliate_partners_user_idx"
+
+ create_table "artifact_updates", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "product", :null => false
+ t.string "version", :null => false
+ t.string "uri", :limit => 2000, :null => false
+ t.string "sha1", :null => false
+ t.string "environment", :default => "public", :null => false
+ t.integer "size", :null => false
+ end
+
+ add_index "artifact_updates", ["product", "version"], :name => "artifact_updates_uniqkey", :unique => true
+
+ create_table "backing_tracks", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "filename", :limit => 1024, :null => false
+ t.string "connection_id", :limit => 64, :null => false
+ t.string "client_track_id", :limit => 64, :null => false
+ t.string "client_resource_id", :limit => 100
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "band_invitations", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "user_id", :limit => 64
+ t.string "band_id", :limit => 64
+ t.boolean "accepted"
+ t.string "creator_id", :limit => 64
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "bands", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "name", :limit => 1024, :null => false
+ t.string "website", :limit => 4000
+ t.string "biography", :limit => 4000, :null => false
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.string "city", :limit => 100
+ t.string "state", :limit => 100
+ t.string "country", :limit => 100
+ t.string "photo_url", :limit => 2048
+ t.string "logo_url", :limit => 2048
+ t.tsvector "name_tsv"
+ t.string "original_fpfile_photo", :limit => 8000
+ t.string "cropped_fpfile_photo", :limit => 8000
+ t.string "cropped_s3_path_photo", :limit => 512
+ t.string "crop_selection_photo", :limit => 256
+ t.decimal "lat", :precision => 15, :scale => 10
+ t.decimal "lng", :precision => 15, :scale => 10
+ t.string "large_photo_url", :limit => 2048
+ t.string "cropped_large_s3_path_photo", :limit => 512
+ t.string "cropped_large_fpfile_photo", :limit => 8000
+ t.boolean "did_real_session", :default => false
+ end
+
+ add_index "bands", ["name_tsv"], :name => "bands_name_tsv_index", :using => :gin
+
+ create_table "bands_musicians", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "band_id", :limit => 64, :null => false
+ t.string "user_id", :limit => 64, :null => false
+ t.boolean "admin", :default => false, :null => false
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ add_index "bands_musicians", ["band_id", "user_id"], :name => "band_musician_uniqkey", :unique => true
+
+# Could not dump table "bg" because of following StandardError
+# Unknown type 'geometry' for column 'the_geom'
+
+ create_table "chat_messages", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "user_id", :limit => 64
+ t.string "music_session_id", :limit => 64
+ t.text "message", :null => false
+ t.datetime "created_at", :null => false
+ end
+
+ create_table "cities", :id => false, :force => true do |t|
+ t.string "city", :null => false
+ t.string "region", :limit => 2, :null => false
+ t.string "countrycode", :limit => 2, :null => false
+ end
+
+ create_table "claimed_recordings", :id => false, :force => true do |t|
+ t.string "user_id", :limit => 64, :null => false
+ t.string "recording_id", :limit => 64, :null => false
+ t.string "id", :limit => 64, :null => false
+ t.string "name", :limit => 200, :null => false
+ t.boolean "is_public", :default => true, :null => false
+ t.string "genre_id", :limit => 64, :null => false
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.string "description", :limit => 8000
+ t.tsvector "description_tsv"
+ t.tsvector "name_tsv"
+ t.boolean "discarded", :default => false
+ t.boolean "upload_to_youtube", :default => false, :null => false
+ end
+
+ add_index "claimed_recordings", ["description_tsv"], :name => "claimed_recordings_description_tsv_index", :using => :gin
+ add_index "claimed_recordings", ["name_tsv"], :name => "claimed_recordings_name_tsv_index", :using => :gin
+ add_index "claimed_recordings", ["user_id", "recording_id"], :name => "musician_recording_uniqkey", :unique => true
+
+# Could not dump table "cohorts" because of following StandardError
+# Unknown type 'json' for column 'data_set'
+
+ create_table "connections", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "user_id", :limit => 64
+ t.string "client_id", :limit => 64, :null => false
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.string "music_session_id", :limit => 64
+ t.string "ip_address", :limit => 64, :null => false
+ t.boolean "as_musician"
+ t.string "aasm_state", :limit => 64, :default => "idle", :null => false
+ t.integer "addr", :limit => 8, :null => false
+ t.integer "locidispid", :limit => 8
+ t.datetime "joined_session_at"
+ t.string "client_type", :limit => 256, :null => false
+ t.integer "stale_time", :default => 40, :null => false
+ t.integer "expire_time", :default => 60, :null => false
+ t.float "last_jam_audio_latency"
+ t.string "channel_id", :limit => 256, :null => false
+ t.boolean "udp_reachable", :default => true, :null => false
+ t.datetime "scoring_timeout", :null => false
+ t.integer "scoring_failures", :default => 0, :null => false
+ t.integer "scoring_timeout_occurrences", :default => 0, :null => false
+ t.integer "scoring_failures_offset", :default => 0, :null => false
+ t.string "gateway", :limit => nil, :default => "default-1", :null => false
+ t.boolean "is_network_testing", :default => false, :null => false
+ end
+
+ add_index "connections", ["client_id"], :name => "connections_client_id_key", :unique => true
+ add_index "connections", ["locidispid"], :name => "connections_locidispid_ndx"
+
+ create_table "countries", :id => false, :force => true do |t|
+ t.string "countrycode", :limit => 2, :null => false
+ t.string "countryname", :limit => 64
+ end
+
+# Could not dump table "county" because of following StandardError
+# Unknown type 'geometry' for column 'the_geom'
+
+ create_table "county_lookup", :id => false, :force => true do |t|
+ t.integer "st_code", :null => false
+ t.string "state", :limit => 2
+ t.integer "co_code", :null => false
+ t.string "name", :limit => 90
+ end
+
+ add_index "county_lookup", ["state"], :name => "county_lookup_state_idx"
+
+ create_table "countysub_lookup", :id => false, :force => true do |t|
+ t.integer "st_code", :null => false
+ t.string "state", :limit => 2
+ t.integer "co_code", :null => false
+ t.string "county", :limit => 90
+ t.integer "cs_code", :null => false
+ t.string "name", :limit => 90
+ end
+
+ add_index "countysub_lookup", ["state"], :name => "countysub_lookup_state_idx"
+
+# Could not dump table "cousub" because of following StandardError
+# Unknown type 'geometry' for column 'the_geom'
+
+ create_table "crash_dumps", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "client_type", :limit => 64, :null => false
+ t.string "client_id", :limit => 64
+ t.string "user_id", :limit => 64
+ t.string "session_id", :limit => 64
+ t.datetime "timestamp"
+ t.string "uri", :limit => 1000
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.string "client_version", :limit => 100, :null => false
+ end
+
+ add_index "crash_dumps", ["client_id"], :name => "crash_dumps_client_id_idx"
+ add_index "crash_dumps", ["timestamp"], :name => "crash_dumps_timestamp_idx"
+ add_index "crash_dumps", ["user_id"], :name => "crash_dumps_user_id_idx"
+
+ create_table "current_network_scores", :id => false, :force => true do |t|
+ t.integer "alocidispid", :limit => 8, :null => false
+ t.integer "blocidispid", :limit => 8, :null => false
+ t.integer "score", :null => false
+ t.boolean "limited", :null => false
+ t.datetime "score_dt", :null => false
+ end
+
+ add_index "current_network_scores", ["alocidispid", "blocidispid"], :name => "current_network_scores_a_b_ndx", :unique => true
+ add_index "current_network_scores", ["blocidispid", "alocidispid"], :name => "current_network_scores_b_a_ndx", :unique => true
+
+ create_table "diagnostics", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "user_id", :limit => 64, :null => false
+ t.string "type", :null => false
+ t.string "creator", :null => false
+ t.text "data"
+ t.datetime "created_at", :null => false
+ end
+
+ add_index "diagnostics", ["type"], :name => "diagnostics_type_idx"
+ add_index "diagnostics", ["user_id"], :name => "diagnostics_user_id"
+
+ create_table "direction_lookup", :id => false, :force => true do |t|
+ t.string "name", :limit => 20, :null => false
+ t.string "abbrev", :limit => 3
+ end
+
+ add_index "direction_lookup", ["abbrev"], :name => "direction_lookup_abbrev_idx"
+
+# Could not dump table "edges" because of following StandardError
+# Unknown type 'geometry' for column 'the_geom'
+
+ create_table "email_batch_sets", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "email_batch_id", :limit => 64
+ t.datetime "started_at"
+ t.text "user_ids", :default => "", :null => false
+ t.integer "batch_count"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.integer "trigger_index", :default => 0, :null => false
+ t.string "sub_type", :limit => 64
+ t.string "user_id", :limit => 64
+ end
+
+ add_index "email_batch_sets", ["email_batch_id", "started_at"], :name => "email_batch_set_uniqkey", :unique => true
+ add_index "email_batch_sets", ["email_batch_id"], :name => "email_batch_set_fkidx"
+ add_index "email_batch_sets", ["user_id", "sub_type"], :name => "email_batch_sets_progress_idx"
+
+ create_table "email_batches", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "subject", :limit => 256
+ t.text "body"
+ t.string "from_email", :limit => 64, :default => "JamKazam ", :null => false
+ t.string "aasm_state", :limit => 32, :default => "pending", :null => false
+ t.text "test_emails", :default => "test@jamkazam.com", :null => false
+ t.integer "opt_in_count", :default => 0, :null => false
+ t.integer "sent_count", :default => 0, :null => false
+ t.integer "lock_version"
+ t.datetime "started_at"
+ t.datetime "completed_at"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.string "type", :limit => 64, :default => "JamRuby::EmailBatch", :null => false
+ t.string "sub_type", :limit => 64
+ end
+
+ create_table "email_errors", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "user_id", :limit => 64
+ t.string "error_type", :limit => 32
+ t.string "email_address", :limit => 256
+ t.string "status", :limit => 32
+ t.datetime "email_date"
+ t.text "reason"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ add_index "email_errors", ["email_address"], :name => "email_error_address_idx"
+ add_index "email_errors", ["user_id"], :name => "email_error_user_fkidx"
+
+ create_table "event_sessions", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.datetime "starts_at"
+ t.datetime "ends_at"
+ t.string "pinned_state"
+ t.string "img_url", :limit => 1024
+ t.integer "img_width"
+ t.integer "img_height"
+ t.string "event_id", :limit => 64
+ t.string "user_id", :limit => 64
+ t.string "band_id", :limit => 64
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.integer "ordinal"
+ end
+
+ create_table "events", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "slug", :limit => 512, :null => false
+ t.text "title"
+ t.text "description"
+ t.boolean "show_sponser", :default => false, :null => false
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.text "social_description"
+ end
+
+ add_index "events", ["slug"], :name => "events_slug_key", :unique => true
+
+ create_table "facebook_signups", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "lookup_id", :null => false
+ t.string "last_name", :limit => 100
+ t.string "first_name", :limit => 100
+ t.string "gender", :limit => 1
+ t.string "email", :limit => 1024
+ t.string "uid", :limit => 1024
+ t.string "token", :limit => 1024
+ t.datetime "token_expires_at"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ add_index "facebook_signups", ["lookup_id"], :name => "facebook_signups_lookup_id_key", :unique => true
+
+# Could not dump table "faces" because of following StandardError
+# Unknown type 'geometry' for column 'the_geom'
+
+ create_table "fan_invitations", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "sender_id", :limit => 64
+ t.string "receiver_id", :limit => 64
+ t.string "music_session_id", :limit => 64
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "featnames", :primary_key => "gid", :force => true do |t|
+ t.integer "tlid", :limit => 8
+ t.string "fullname", :limit => 100
+ t.string "name", :limit => 100
+ t.string "predirabrv", :limit => 15
+ t.string "pretypabrv", :limit => 50
+ t.string "prequalabr", :limit => 15
+ t.string "sufdirabrv", :limit => 15
+ t.string "suftypabrv", :limit => 50
+ t.string "sufqualabr", :limit => 15
+ t.string "predir", :limit => 2
+ t.string "pretyp", :limit => 3
+ t.string "prequal", :limit => 2
+ t.string "sufdir", :limit => 2
+ t.string "suftyp", :limit => 3
+ t.string "sufqual", :limit => 2
+ t.string "linearid", :limit => 22
+ t.string "mtfcc", :limit => 5
+ t.string "paflag", :limit => 1
+ t.string "statefp", :limit => 2
+ end
+
+ add_index "featnames", ["tlid", "statefp"], :name => "idx_tiger_featnames_tlid_statefp"
+
+ create_table "feeds", :force => true do |t|
+ t.string "recording_id", :limit => 64
+ t.string "music_session_id", :limit => 64
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.boolean "active", :default => false
+ end
+
+ add_index "feeds", ["music_session_id"], :name => "feeds_music_session_id_key", :unique => true
+ add_index "feeds", ["recording_id"], :name => "feeds_recording_id_key", :unique => true
+
+ create_table "follows", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "user_id", :limit => 64, :null => false
+ t.string "followable_id", :limit => 64, :null => false
+ t.string "followable_type", :limit => 25, :null => false
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ add_index "follows", ["user_id", "followable_id"], :name => "follows_user_uniqkey", :unique => true
+
+ create_table "friend_requests", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "user_id", :limit => 64
+ t.string "friend_id", :limit => 64
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.string "status", :limit => 50
+ t.string "message", :limit => 4000
+ end
+
+ create_table "friendships", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "user_id", :limit => 64
+ t.string "friend_id", :limit => 64
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ add_index "friendships", ["user_id", "friend_id"], :name => "user_friend_uniqkey", :unique => true
+
+ create_table "generic_state", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.datetime "score_history_last_imported_at"
+ t.string "env", :default => "development", :null => false
+ end
+
+ create_table "genre_players", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "player_id", :limit => 64, :null => false
+ t.string "genre_id", :limit => 64, :null => false
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.string "player_type", :limit => 128
+ end
+
+ add_index "genre_players", ["player_id", "player_type", "genre_id"], :name => "genre_player_uniqkey", :unique => true
+
+ create_table "genres", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "description", :limit => 1024, :null => false
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "genres_music_sessions", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "genre_id", :limit => 64
+ t.string "music_session_id", :limit => 64
+ end
+
+ create_table "geocode_settings", :id => false, :force => true do |t|
+ t.text "name", :null => false
+ t.text "setting"
+ t.text "unit"
+ t.text "category"
+ t.text "short_desc"
+ end
+
+# Could not dump table "geoipblocks" because of following StandardError
+# Unknown type 'geometry(Polygon)' for column 'geom'
+
+ create_table "geoipisp", :id => false, :force => true do |t|
+ t.integer "beginip", :limit => 8, :null => false
+ t.integer "endip", :limit => 8, :null => false
+ t.string "company", :limit => 50, :null => false
+ end
+
+ add_index "geoipisp", ["company"], :name => "geoipisp_company_ndx"
+
+ create_table "geoiplocations", :id => false, :force => true do |t|
+ t.integer "locid", :null => false
+ t.string "countrycode", :limit => 2
+ t.string "region", :limit => 2
+ t.string "city"
+ t.string "postalcode", :limit => 8
+ t.float "latitude", :null => false
+ t.float "longitude", :null => false
+ t.integer "metrocode"
+ t.string "areacode", :limit => 3
+ t.integer "geog", :limit => 0
+ end
+
+ add_index "geoiplocations", ["geog"], :name => "geoiplocations_geog_gix", :using => :gist
+
+ create_table "icecast_admin_authentications", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "source_pass", :limit => 64, :null => false
+ t.string "relay_user", :limit => 64, :null => false
+ t.string "relay_pass", :limit => 64, :null => false
+ t.string "admin_user", :limit => 64, :null => false
+ t.string "admin_pass", :limit => 64, :null => false
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "icecast_directories", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.integer "yp_url_timeout", :default => 15, :null => false
+ t.string "yp_url", :limit => 1024, :null => false
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "icecast_limits", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.integer "clients", :default => 1000, :null => false
+ t.integer "sources", :default => 50, :null => false
+ t.integer "queue_size", :default => 102400, :null => false
+ t.integer "client_timeout", :default => 30
+ t.integer "header_timeout", :default => 15
+ t.integer "source_timeout", :default => 10
+ t.integer "burst_size", :default => 65536
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "icecast_listen_sockets", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.integer "port", :default => 8001, :null => false
+ t.string "bind_address", :limit => 1024
+ t.string "shoutcast_mount", :limit => 1024
+ t.integer "shoutcast_compat"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "icecast_loggings", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "access_log", :limit => 1024, :default => "access.log", :null => false
+ t.string "error_log", :limit => 1024, :default => "error.log", :null => false
+ t.string "playlist_log", :limit => 1024
+ t.integer "log_level", :default => 3, :null => false
+ t.integer "log_archive"
+ t.integer "log_size", :default => 10000
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "icecast_master_server_relays", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "master_server", :limit => 1024, :null => false
+ t.integer "master_server_port", :default => 8001, :null => false
+ t.integer "master_update_interval", :default => 120, :null => false
+ t.string "master_username", :limit => 64, :null => false
+ t.string "master_pass", :limit => 64, :null => false
+ t.integer "relays_on_demand", :default => 1, :null => false
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "icecast_mount_templates", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "name", :limit => 256, :null => false
+ t.string "source_username", :limit => 64
+ t.string "source_pass", :limit => 64
+ t.integer "max_listeners", :default => 10000
+ t.integer "max_listener_duration", :default => 3600
+ t.string "dump_file", :limit => 1024
+ t.string "intro", :limit => 1024
+ t.string "fallback_mount", :limit => 1024
+ t.integer "fallback_override", :default => 1
+ t.integer "fallback_when_full", :default => 1
+ t.string "charset", :limit => 1024, :default => "ISO8859-1"
+ t.integer "is_public", :default => 0
+ t.string "stream_name", :limit => 1024
+ t.string "stream_description", :limit => 10000
+ t.string "stream_url", :limit => 1024
+ t.string "genre", :limit => 256
+ t.integer "bitrate"
+ t.string "mime_type", :limit => 64, :default => "audio/mpeg", :null => false
+ t.string "subtype", :limit => 64
+ t.integer "burst_size"
+ t.integer "mp3_metadata_interval"
+ t.integer "hidden", :default => 1
+ t.string "on_connect", :limit => 1024
+ t.string "on_disconnect", :limit => 1024
+ t.string "authentication_id", :limit => 64, :null => false
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "icecast_mounts", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "name", :limit => 1024, :null => false
+ t.string "source_username", :limit => 64
+ t.string "source_pass", :limit => 64
+ t.integer "max_listeners", :default => 10000
+ t.integer "max_listener_duration", :default => 3600
+ t.string "dump_file", :limit => 1024
+ t.string "intro", :limit => 1024
+ t.string "fallback_mount", :limit => 1024
+ t.integer "fallback_override", :default => 1
+ t.integer "fallback_when_full", :default => 1
+ t.string "charset", :limit => 1024, :default => "ISO8859-1"
+ t.integer "is_public", :default => 0
+ t.string "stream_name", :limit => 1024
+ t.string "stream_description", :limit => 10000
+ t.string "stream_url", :limit => 1024
+ t.string "genre", :limit => 256
+ t.integer "bitrate"
+ t.string "mime_type", :limit => 64
+ t.string "subtype", :limit => 64
+ t.integer "burst_size"
+ t.integer "mp3_metadata_interval"
+ t.integer "hidden", :default => 1
+ t.string "on_connect", :limit => 1024
+ t.string "on_disconnect", :limit => 1024
+ t.string "authentication_id", :limit => 64
+ t.integer "listeners", :default => 0, :null => false
+ t.boolean "sourced", :default => false, :null => false
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.string "music_session_id", :limit => 64
+ t.string "icecast_server_id", :limit => 64, :null => false
+ t.string "icecast_mount_template_id", :limit => 64
+ t.datetime "sourced_needs_changing_at"
+ t.boolean "source_direction", :default => false, :null => false
+ end
+
+ add_index "icecast_mounts", ["name"], :name => "icecast_mounts_name_key", :unique => true
+
+ create_table "icecast_paths", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "base_dir", :limit => 1024, :default => "./", :null => false
+ t.string "log_dir", :limit => 1024, :default => "./logs", :null => false
+ t.string "pid_file", :limit => 1024, :default => "./icecast.pid"
+ t.string "web_root", :limit => 1024, :default => "./web", :null => false
+ t.string "admin_root", :limit => 1024, :default => "./admin", :null => false
+ t.string "allow_ip", :limit => 1024
+ t.string "deny_ip", :limit => 1024
+ t.string "alias_source", :limit => 1024
+ t.string "alias_dest", :limit => 1024
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "icecast_relays", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "server", :limit => 1024, :null => false
+ t.integer "port", :default => 8001, :null => false
+ t.string "mount", :limit => 1024, :null => false
+ t.string "local_mount", :limit => 1024
+ t.string "relay_username", :limit => 64
+ t.string "relay_pass", :limit => 64
+ t.integer "relay_shoutcast_metadata", :default => 0
+ t.integer "on_demand", :default => 1
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "icecast_securities", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.integer "chroot", :default => 0, :null => false
+ t.string "change_owner_user", :limit => 64
+ t.string "change_owner_group", :limit => 64
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "icecast_server_groups", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "name", :null => false
+ end
+
+ add_index "icecast_server_groups", ["name"], :name => "icecast_server_groups_name_key", :unique => true
+
+ create_table "icecast_server_mounts", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "icecast_mount_id", :limit => 64
+ t.string "icecast_server_id", :limit => 64
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ add_index "icecast_server_mounts", ["icecast_mount_id", "icecast_server_id"], :name => "server_mount_uniqkey", :unique => true
+
+ create_table "icecast_server_relays", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "icecast_relay_id", :limit => 64
+ t.string "icecast_server_id", :limit => 64
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ add_index "icecast_server_relays", ["icecast_relay_id", "icecast_server_id"], :name => "server_relay_uniqkey", :unique => true
+
+ create_table "icecast_server_sockets", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "icecast_listen_socket_id", :limit => 64
+ t.string "icecast_server_id", :limit => 64
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ add_index "icecast_server_sockets", ["icecast_listen_socket_id", "icecast_server_id"], :name => "server_socket_uniqkey", :unique => true
+
+ create_table "icecast_servers", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.integer "config_changed", :default => 0
+ t.string "limit_id", :limit => 64
+ t.string "admin_auth_id", :limit => 64
+ t.string "directory_id", :limit => 64
+ t.string "master_relay_id", :limit => 64
+ t.string "path_id", :limit => 64
+ t.string "logging_id", :limit => 64
+ t.string "security_id", :limit => 64
+ t.string "template_id", :limit => 64, :null => false
+ t.string "hostname", :limit => 1024, :null => false
+ t.string "server_id", :limit => 1024, :null => false
+ t.string "location", :limit => 1024
+ t.string "admin_email", :limit => 1024
+ t.integer "fileserve"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.string "icecast_server_group_id", :limit => 64, :default => "default", :null => false
+ t.string "mount_template_id", :limit => 64
+ t.datetime "config_updated_at"
+ end
+
+ add_index "icecast_servers", ["server_id"], :name => "icecast_servers_server_id_key", :unique => true
+
+ create_table "icecast_source_changes", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.boolean "source_direction", :null => false
+ t.string "change_type", :limit => 64, :null => false
+ t.string "user_id", :limit => 64
+ t.string "client_id", :limit => 64
+ t.boolean "success", :null => false
+ t.string "reason", :limit => nil
+ t.string "detail", :limit => nil
+ t.datetime "created_at", :null => false
+ t.string "icecast_mount_id", :limit => 64, :null => false
+ end
+
+ create_table "icecast_template_sockets", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "icecast_listen_socket_id", :limit => 64
+ t.string "icecast_template_id", :limit => 64
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ add_index "icecast_template_sockets", ["icecast_listen_socket_id", "icecast_template_id"], :name => "template_socket_uniqkey", :unique => true
+
+ create_table "icecast_templates", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "limit_id", :limit => 64
+ t.string "admin_auth_id", :limit => 64
+ t.string "directory_id", :limit => 64
+ t.string "master_relay_id", :limit => 64
+ t.string "path_id", :limit => 64
+ t.string "logging_id", :limit => 64
+ t.string "security_id", :limit => 64
+ t.string "location", :limit => 1024, :null => false
+ t.string "name", :limit => 256, :null => false
+ t.string "admin_email", :limit => 1024, :default => "admin@jamkazam.com", :null => false
+ t.integer "fileserve", :default => 1, :null => false
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "icecast_user_authentications", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "authentication_type", :limit => 16, :default => "url"
+ t.string "filename", :limit => 1024
+ t.integer "allow_duplicate_users"
+ t.string "mount_add", :limit => 1024
+ t.string "mount_remove", :limit => 1024
+ t.string "listener_add", :limit => 1024
+ t.string "listener_remove", :limit => 1024
+ t.string "unused_username", :limit => 64
+ t.string "unused_pass", :limit => 64
+ t.string "auth_header", :limit => 64, :default => "icecast-auth-user: 1"
+ t.string "timelimit_header", :limit => 64, :default => "icecast-auth-timelimit:"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "instruments", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "description", :limit => 1024, :null => false
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.integer "popularity", :default => 0, :null => false
+ end
+
+ create_table "invitations", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "sender_id", :limit => 64
+ t.string "receiver_id", :limit => 64
+ t.string "music_session_id", :limit => 64
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.string "join_request_id", :limit => 64
+ end
+
+ create_table "invited_users", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "sender_id", :limit => 64
+ t.boolean "autofriend", :null => false
+ t.string "email", :limit => 256
+ t.string "invitation_code", :limit => 256, :null => false
+ t.boolean "accepted", :default => false
+ t.text "note"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.string "invite_medium", :limit => 64
+ end
+
+ add_index "invited_users", ["invitation_code"], :name => "invited_users_invitation_code_key", :unique => true
+
+ create_table "isp_score_batch", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.text "json_scoring_data", :null => false
+ t.datetime "created_at", :null => false
+ end
+
+ create_table "jam_track_licensors", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "name", :limit => nil, :null => false
+ t.text "description"
+ t.text "attention"
+ t.string "address_line_1", :limit => nil
+ t.string "address_line_2", :limit => nil
+ t.string "city", :limit => nil
+ t.string "state", :limit => nil
+ t.string "zip_code", :limit => nil
+ t.string "contact", :limit => nil
+ t.string "email", :limit => nil
+ t.string "phone", :limit => nil
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ add_index "jam_track_licensors", ["name"], :name => "jam_track_licensors_name_key", :unique => true
+
+ create_table "jam_track_rights", :force => true do |t|
+ t.string "user_id", :limit => 64, :null => false
+ t.integer "jam_track_id", :limit => 8, :null => false
+ t.string "url", :limit => 2048
+ t.string "md5", :limit => nil
+ t.integer "length", :default => 0, :null => false
+ t.integer "download_count", :default => 0, :null => false
+ t.boolean "signed", :default => false, :null => false
+ t.boolean "downloaded_since_sign", :default => false, :null => false
+ t.datetime "last_signed_at"
+ t.datetime "last_downloaded_at"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.string "private_key", :limit => nil
+ t.datetime "signing_queued_at"
+ t.datetime "signing_started_at"
+ t.integer "error_count", :default => 0, :null => false
+ t.string "error_reason", :limit => nil
+ t.string "error_detail", :limit => nil
+ t.boolean "should_retry", :default => false, :null => false
+ t.boolean "redeemed", :default => false, :null => false
+ end
+
+ add_index "jam_track_rights", ["user_id", "jam_track_id"], :name => "jam_tracks_rights_uniqkey"
+
+ create_table "jam_track_tap_ins", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.integer "offset_time", :null => false
+ t.integer "jam_track_id", :limit => 8, :null => false
+ t.decimal "bpm", :null => false
+ t.integer "tap_in_count", :default => 0, :null => false
+ end
+
+ create_table "jam_track_tracks", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.integer "position"
+ t.string "track_type", :limit => nil
+ t.integer "jam_track_id", :limit => 8, :null => false
+ t.string "instrument_id", :limit => 64
+ t.string "part", :limit => nil
+ t.string "url", :limit => nil
+ t.string "md5", :limit => nil
+ t.integer "length", :limit => 8
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ add_index "jam_track_tracks", ["position", "jam_track_id"], :name => "jam_track_tracks_position_uniqkey"
+
+ create_table "jam_tracks", :force => true do |t|
+ t.string "name", :limit => nil, :null => false
+ t.text "description"
+ t.string "time_signature", :limit => nil
+ t.string "status", :limit => nil
+ t.string "recording_type", :limit => nil
+ t.text "original_artist"
+ t.text "songwriter"
+ t.text "publisher"
+ t.string "pro", :limit => nil
+ t.string "sales_region", :limit => nil
+ t.decimal "price"
+ t.boolean "reproduction_royalty"
+ t.boolean "public_performance_royalty"
+ t.decimal "reproduction_royalty_amount"
+ t.decimal "licensor_royalty_amount"
+ t.decimal "pro_royalty_amount"
+ t.string "url", :limit => nil
+ t.string "md5", :limit => nil
+ t.integer "length", :limit => 8
+ t.string "licensor_id", :limit => 64
+ t.string "genre_id", :limit => 64
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.string "plan_code", :limit => 50
+ t.decimal "initial_play_silence", :default => 5.0, :null => false
+ t.boolean "available", :default => false, :null => false
+ end
+
+ add_index "jam_tracks", ["name"], :name => "jam_tracks_name_key", :unique => true
+
+ create_table "jamcompany", :primary_key => "coid", :force => true do |t|
+ t.string "company", :limit => 50, :null => false
+ end
+
+ add_index "jamcompany", ["company"], :name => "jamcompany_company_ndx", :unique => true
+
+# Could not dump table "jamisp" because of following StandardError
+# Unknown type 'geometry(Polygon)' for column 'geom'
+
+ create_table "join_requests", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "user_id", :limit => 64
+ t.string "music_session_id", :limit => 64
+ t.string "text", :limit => 2000
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ add_index "join_requests", ["user_id", "music_session_id"], :name => "user_music_session_uniqkey", :unique => true
+
+ create_table "latency_testers", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "client_id", :limit => 64, :null => false
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ add_index "latency_testers", ["client_id"], :name => "latency_testers_client_id_key", :unique => true
+
+ create_table "layer", :id => false, :force => true do |t|
+ t.integer "topology_id", :null => false
+ t.integer "layer_id", :null => false
+ t.string "schema_name", :limit => nil, :null => false
+ t.string "table_name", :limit => nil, :null => false
+ t.string "feature_column", :limit => nil, :null => false
+ t.integer "feature_type", :null => false
+ t.integer "level", :default => 0, :null => false
+ t.integer "child_id"
+ end
+
+ add_index "layer", ["schema_name", "table_name", "feature_column"], :name => "layer_schema_name_table_name_feature_column_key", :unique => true
+
+ create_table "likes", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "user_id", :limit => 64, :null => false
+ t.string "likable_id", :limit => 64, :null => false
+ t.string "likable_type", :limit => 25, :null => false
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ add_index "likes", ["user_id", "likable_id"], :name => "likes_user_uniqkey", :unique => true
+
+ create_table "loader_lookuptables", :id => false, :force => true do |t|
+ t.integer "process_order", :default => 1000, :null => false
+ t.text "lookup_name", :null => false
+ t.text "table_name"
+ t.boolean "single_mode", :default => true, :null => false
+ t.boolean "load", :default => true, :null => false
+ t.boolean "level_county", :default => false, :null => false
+ t.boolean "level_state", :default => false, :null => false
+ t.boolean "level_nation", :default => false, :null => false
+ t.text "post_load_process"
+ t.boolean "single_geom_mode", :default => false
+ t.string "insert_mode", :limit => 1, :default => "c", :null => false
+ t.text "pre_load_process"
+ t.text "columns_exclude", :array => true
+ t.text "website_root_override"
+ end
+
+ create_table "loader_platform", :id => false, :force => true do |t|
+ t.string "os", :limit => 50, :null => false
+ t.text "declare_sect"
+ t.text "pgbin"
+ t.text "wget"
+ t.text "unzip_command"
+ t.text "psql"
+ t.text "path_sep"
+ t.text "loader"
+ t.text "environ_set_command"
+ t.text "county_process_command"
+ end
+
+ create_table "loader_variables", :id => false, :force => true do |t|
+ t.string "tiger_year", :limit => 4, :null => false
+ t.text "website_root"
+ t.text "staging_fold"
+ t.text "data_schema"
+ t.text "staging_schema"
+ end
+
+ create_table "max_mind_releases", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.date "released_at", :null => false
+ t.boolean "imported", :default => false, :null => false
+ t.date "imported_at"
+ t.string "geo_ip_124_url", :limit => 2000
+ t.string "geo_ip_124_md5"
+ t.integer "geo_ip_124_size"
+ t.string "geo_ip_134_url", :limit => 2000
+ t.string "geo_ip_134_md5"
+ t.integer "geo_ip_134_size"
+ t.string "region_codes_url", :limit => 2000
+ t.string "region_codes_md5"
+ t.integer "region_codes_size"
+ t.string "iso3166_url", :limit => 2000
+ t.string "iso3166_md5"
+ t.integer "iso3166_size"
+ t.string "table_dumps_url", :limit => 2000
+ t.string "table_dumps_md5"
+ t.integer "table_dumps_size"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ add_index "max_mind_releases", ["released_at"], :name => "max_mind_releases_released_at_key", :unique => true
+
+ create_table "mixes", :force => true do |t|
+ t.string "recording_id", :limit => 64, :null => false
+ t.string "mix_server", :limit => 64
+ t.datetime "started_at"
+ t.datetime "completed_at"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.string "ogg_md5", :limit => 100
+ t.integer "ogg_length"
+ t.string "ogg_url", :limit => 1024
+ t.boolean "completed", :default => false, :null => false
+ t.integer "error_count", :default => 0, :null => false
+ t.text "error_reason"
+ t.text "error_detail"
+ t.boolean "should_retry", :default => false, :null => false
+ t.string "mp3_md5", :limit => 100
+ t.integer "mp3_length"
+ t.string "mp3_url", :limit => 1024
+ t.integer "download_count", :default => 0, :null => false
+ t.datetime "last_downloaded_at"
+ end
+
+ add_index "mixes", ["completed_at"], :name => "index_completed_at"
+ add_index "mixes", ["started_at"], :name => "index_started_at"
+
+ create_table "music_notations", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "user_id", :limit => 64, :null => false
+ t.string "music_session_id", :limit => 64
+ t.string "file_url", :limit => 512
+ t.integer "size"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.string "file_name"
+ end
+
+ create_table "music_session_perf_data", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "music_session_id", :limit => 64
+ t.string "client_id", :limit => 64
+ t.string "uri", :limit => 1000
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "music_sessions", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "music_session_id", :limit => 64
+ t.string "description", :limit => 8000
+ t.string "user_id", :limit => 64, :null => false
+ t.string "band_id", :limit => 64
+ t.datetime "created_at", :null => false
+ t.datetime "session_removed_at"
+ t.integer "play_count", :default => 0, :null => false
+ t.integer "like_count", :default => 0, :null => false
+ t.boolean "fan_access", :default => true, :null => false
+ t.datetime "scheduled_start"
+ t.string "scheduled_duration", :limit => nil
+ t.boolean "musician_access", :default => true, :null => false
+ t.boolean "approval_required", :default => false, :null => false
+ t.boolean "fan_chat", :default => true, :null => false
+ t.string "genre_id", :limit => 64, :null => false
+ t.string "legal_policy", :default => "standard", :null => false
+ t.string "language", :default => "eng", :null => false
+ t.text "name", :null => false
+ t.string "recurring_session_id", :limit => 64
+ t.string "recurring_mode", :limit => 50, :default => "once", :null => false
+ t.string "timezone"
+ t.datetime "started_at"
+ t.boolean "open_rsvps", :default => false, :null => false
+ t.boolean "next_session_scheduled", :default => false
+ t.tsvector "description_tsv"
+ t.boolean "is_unstructured_rsvp", :default => false
+ t.boolean "canceled", :default => false
+ t.string "create_type", :limit => 64
+ end
+
+ add_index "music_sessions", ["description_tsv"], :name => "music_sessions_description_tsv_index", :using => :gin
+ add_index "music_sessions", ["music_session_id"], :name => "music_session_uniqkey", :unique => true
+
+ create_table "music_sessions_comments", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "creator_id", :limit => 64, :null => false
+ t.string "comment", :limit => 4000, :null => false
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.inet "ip_address"
+ t.string "music_session_id", :limit => 64
+ end
+
+ create_table "music_sessions_likers", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "liker_id", :limit => 64
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.inet "ip_address"
+ t.string "music_session_id", :limit => 64
+ end
+
+ create_table "music_sessions_user_history", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "user_id", :limit => 64, :null => false
+ t.string "client_id", :limit => 64, :null => false
+ t.datetime "created_at", :null => false
+ t.datetime "session_removed_at"
+ t.integer "max_concurrent_connections"
+ t.integer "rating"
+ t.string "instruments"
+ t.text "rating_comment"
+ t.string "music_session_id", :limit => 64
+ end
+
+ add_index "music_sessions_user_history", ["music_session_id"], :name => "msuh_music_session_idx"
+
+ create_table "musicians_instruments", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "user_id", :limit => 64, :null => false
+ t.string "instrument_id", :limit => 64, :null => false
+ t.integer "proficiency_level", :limit => 2, :null => false
+ t.integer "priority", :limit => 2, :default => 1, :null => false
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ add_index "musicians_instruments", ["user_id", "instrument_id"], :name => "musician_instrument_uniqkey", :unique => true
+
+ create_table "notifications", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "description", :limit => 100, :null => false
+ t.string "source_user_id", :limit => 64
+ t.string "target_user_id", :limit => 64
+ t.string "band_id", :limit => 64
+ t.string "session_id", :limit => 64
+ t.string "recording_id", :limit => 64
+ t.string "invitation_id", :limit => 64
+ t.string "join_request_id", :limit => 64
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.string "friend_request_id", :limit => 64
+ t.string "band_invitation_id", :limit => 64
+ t.text "message"
+ t.integer "jam_track_right_id", :limit => 8
+ end
+
+ create_table "pagc_gaz", :force => true do |t|
+ t.integer "seq"
+ t.text "word"
+ t.text "stdword"
+ t.integer "token"
+ t.boolean "is_custom", :default => true, :null => false
+ end
+
+ create_table "pagc_lex", :force => true do |t|
+ t.integer "seq"
+ t.text "word"
+ t.text "stdword"
+ t.integer "token"
+ t.boolean "is_custom", :default => true, :null => false
+ end
+
+ create_table "pagc_rules", :force => true do |t|
+ t.text "rule"
+ t.boolean "is_custom", :default => true
+ end
+
+ create_table "performance_samples", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "user_id", :limit => 64, :null => false
+ t.string "url", :limit => 4000
+ t.string "type", :limit => 100, :null => false
+ t.string "claimed_recording_id", :limit => 64
+ t.string "service_id", :limit => 100
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+# Could not dump table "place" because of following StandardError
+# Unknown type 'geometry' for column 'the_geom'
+
+ create_table "place_lookup", :id => false, :force => true do |t|
+ t.integer "st_code", :null => false
+ t.string "state", :limit => 2
+ t.integer "pl_code", :null => false
+ t.string "name", :limit => 90
+ end
+
+ add_index "place_lookup", ["state"], :name => "place_lookup_state_idx"
+
+ create_table "playable_plays", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "playable_id", :limit => 64, :null => false
+ t.string "playable_type", :limit => 128, :null => false
+ t.string "player_id", :limit => 64
+ t.string "claimed_recording_id", :limit => 64
+ t.inet "ip_address"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "promotionals", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "type", :limit => 128, :default => "JamRuby::PromoBuzz", :null => false
+ t.string "aasm_state", :limit => 64, :default => "hidden"
+ t.integer "position", :default => 0, :null => false
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.string "latest_id", :limit => 64
+ t.string "latest_type", :limit => 128
+ t.string "image", :limit => 1024
+ t.string "text_short", :limit => 512
+ t.string "text_long", :limit => 4096
+ end
+
+ add_index "promotionals", ["latest_id", "latest_type"], :name => "promo_latest_idx"
+
+ create_table "quick_mixes", :force => true do |t|
+ t.integer "next_part_to_upload", :default => 0, :null => false
+ t.boolean "fully_uploaded", :default => false, :null => false
+ t.string "upload_id", :limit => 1024
+ t.integer "file_offset", :limit => 8, :default => 0
+ t.boolean "is_part_uploading", :default => false, :null => false
+ t.integer "upload_failures", :default => 0
+ t.integer "part_failures", :default => 0
+ t.string "ogg_md5", :limit => 100
+ t.integer "ogg_length"
+ t.string "ogg_url", :limit => 1000
+ t.string "mp3_md5", :limit => 100
+ t.integer "mp3_length"
+ t.string "mp3_url", :limit => 1000
+ t.integer "error_count", :default => 0, :null => false
+ t.text "error_reason"
+ t.text "error_detail"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.datetime "started_at"
+ t.datetime "completed_at"
+ t.boolean "completed", :default => false, :null => false
+ t.boolean "should_retry", :default => false, :null => false
+ t.boolean "cleaned", :default => false, :null => false
+ t.string "user_id", :limit => 64
+ t.string "recording_id", :limit => 64
+ end
+
+ create_table "recorded_backing_tracks", :force => true do |t|
+ t.string "user_id", :limit => 64
+ t.string "backing_track_id", :limit => 64
+ t.string "recording_id", :limit => 64, :null => false
+ t.string "client_track_id", :limit => 64, :null => false
+ t.boolean "is_part_uploading", :default => false, :null => false
+ t.integer "next_part_to_upload", :default => 0, :null => false
+ t.string "upload_id", :limit => 1024
+ t.integer "part_failures", :default => 0, :null => false
+ t.boolean "discard"
+ t.integer "download_count", :default => 0, :null => false
+ t.string "md5", :limit => 100
+ t.integer "length", :limit => 8
+ t.string "client_id", :limit => 64, :null => false
+ t.integer "file_offset", :limit => 8
+ t.string "url", :limit => 1024, :null => false
+ t.boolean "fully_uploaded", :default => false, :null => false
+ t.integer "upload_failures", :default => 0, :null => false
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.string "filename", :limit => nil, :null => false
+ t.datetime "last_downloaded_at"
+ end
+
+ create_table "recorded_tracks", :force => true do |t|
+ t.string "user_id", :limit => 64, :null => false
+ t.string "instrument_id", :limit => 64, :null => false
+ t.string "sound", :limit => 64, :null => false
+ t.integer "next_part_to_upload", :default => 0, :null => false
+ t.boolean "fully_uploaded", :default => false, :null => false
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.string "upload_id", :limit => 1024
+ t.string "recording_id", :limit => 64, :null => false
+ t.string "md5", :limit => 100
+ t.integer "length", :limit => 8
+ t.string "client_id", :limit => 64, :null => false
+ t.string "track_id", :limit => 64, :null => false
+ t.string "url", :limit => 1024
+ t.integer "file_offset", :limit => 8, :default => 0
+ t.string "client_track_id", :limit => 64, :null => false
+ t.boolean "is_part_uploading", :default => false, :null => false
+ t.integer "upload_failures", :default => 0, :null => false
+ t.integer "part_failures", :default => 0, :null => false
+ t.boolean "discard"
+ t.integer "download_count", :default => 0, :null => false
+ t.datetime "last_downloaded_at"
+ end
+
+ create_table "recorded_videos", :force => true do |t|
+ t.string "user_id", :limit => 64
+ t.boolean "fully_uploaded", :default => false, :null => false
+ t.string "recording_id", :limit => 64, :null => false
+ t.integer "length", :limit => 8
+ t.string "client_video_source_id", :limit => 64, :null => false
+ t.string "url", :limit => 1024
+ t.integer "file_offset", :limit => 8
+ t.integer "upload_failures", :default => 0, :null => false
+ t.boolean "discard"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "recordings", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.string "owner_id", :limit => 64, :null => false
+ t.string "music_session_id", :limit => 64
+ t.string "band_id", :limit => 64
+ t.integer "duration"
+ t.boolean "is_done", :default => false
+ t.boolean "all_discarded", :default => false, :null => false
+ t.string "name", :limit => 1024
+ t.integer "play_count", :default => 0, :null => false
+ t.integer "like_count", :default => 0, :null => false
+ t.boolean "has_stream_mix", :default => false, :null => false
+ t.boolean "has_final_mix", :default => false, :null => false
+ t.integer "first_quick_mix_id", :limit => 8
+ t.boolean "deleted", :default => false, :null => false
+ end
+
+ create_table "recordings_comments", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "recording_id", :limit => 64, :null => false
+ t.string "creator_id", :limit => 64, :null => false
+ t.string "comment", :limit => 4000, :null => false
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.inet "ip_address"
+ end
+
+ create_table "recordings_downloads", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "recording_id", :limit => 64, :null => false
+ t.string "downloader_id", :limit => 64, :null => false
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "recordings_likers", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "recording_id", :limit => 64, :null => false
+ t.string "liker_id", :limit => 64
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.inet "ip_address"
+ t.string "claimed_recording_id", :limit => 64, :null => false
+ t.boolean "favorite", :default => true, :null => false
+ end
+
+ add_index "recordings_likers", ["recording_id", "liker_id"], :name => "recording_liker_uniqkey", :unique => true
+
+ create_table "recurring_sessions", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "description", :limit => 8000
+ t.datetime "scheduled_start"
+ t.string "scheduled_duration", :limit => nil
+ t.boolean "musician_access", :null => false
+ t.boolean "approval_required", :null => false
+ t.boolean "fan_chat", :null => false
+ t.string "genre_id", :limit => 64
+ t.string "legal_policy", :default => "standard", :null => false
+ t.string "language", :default => "en", :null => false
+ t.text "name"
+ t.string "user_id", :limit => 64, :null => false
+ t.string "band_id", :limit => 64
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "regions", :id => false, :force => true do |t|
+ t.string "region", :limit => 2, :null => false
+ t.string "regionname", :limit => 64
+ t.string "countrycode", :limit => 2, :null => false
+ end
+
+ add_index "regions", ["countrycode", "region"], :name => "regions_countrycode_region_ndx", :unique => true
+ add_index "regions", ["countrycode"], :name => "regions_countrycode_ndx"
+
+ create_table "rsvp_requests", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "user_id", :limit => 64, :null => false
+ t.boolean "canceled", :default => false
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.boolean "cancel_all", :default => false
+ end
+
+ create_table "rsvp_requests_rsvp_slots", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "rsvp_request_id", :limit => 64, :null => false
+ t.string "rsvp_slot_id", :limit => 64, :null => false
+ t.boolean "chosen"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "rsvp_slots", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "instrument_id", :limit => 64
+ t.integer "proficiency_level", :limit => 2
+ t.string "music_session_id", :limit => 64, :null => false
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.boolean "is_unstructured_rsvp", :default => false
+ end
+
+ create_table "score_histories", :id => false, :force => true do |t|
+ t.string "from_client_id", :limit => 64
+ t.integer "from_addr", :limit => 8
+ t.string "from_isp", :limit => 50
+ t.string "from_country", :limit => 64
+ t.string "from_region", :limit => 64
+ t.string "from_city"
+ t.string "from_postal", :limit => 25
+ t.float "from_latitude"
+ t.float "from_longitude"
+ t.string "to_client_id", :limit => 64
+ t.integer "to_addr", :limit => 8
+ t.string "to_isp", :limit => 50
+ t.string "to_country", :limit => 64
+ t.string "to_region", :limit => 64
+ t.string "to_city"
+ t.string "to_postal", :limit => 25
+ t.float "to_latitude"
+ t.float "to_longitude"
+ t.integer "score", :null => false
+ t.datetime "score_dt", :null => false
+ t.text "scoring_data"
+ t.string "from_user_id", :limit => 64
+ t.string "to_user_id", :limit => 64
+ t.string "from_latency_tester_id", :limit => 64
+ t.string "to_latency_tester_id", :limit => 64
+ t.integer "from_locidispid", :limit => 8, :null => false
+ t.integer "to_locidispid", :limit => 8, :null => false
+ end
+
+ create_table "scores", :id => false, :force => true do |t|
+ t.integer "alocidispid", :limit => 8, :null => false
+ t.string "anodeid", :limit => 64, :null => false
+ t.integer "aaddr", :limit => 8, :null => false
+ t.integer "blocidispid", :limit => 8, :null => false
+ t.string "bnodeid", :limit => 64, :null => false
+ t.integer "baddr", :limit => 8, :null => false
+ t.integer "score", :null => false
+ t.integer "scorer", :null => false
+ t.datetime "score_dt", :null => false
+ t.string "scoring_data", :limit => 4000
+ t.datetime "created_at", :null => false
+ t.string "auserid", :limit => 64
+ t.string "buserid", :limit => 64
+ t.string "alatencytestid", :limit => 64
+ t.string "blatencytestid", :limit => 64
+ end
+
+ add_index "scores", ["alocidispid", "blocidispid", "score_dt"], :name => "scores_alocidispid_blocidispid_score_dt_ndx"
+ add_index "scores", ["blocidispid", "alocidispid", "score_dt"], :name => "scores_blocidispid_alocidispid_score_dt_ndx"
+
+ create_table "secondary_unit_lookup", :id => false, :force => true do |t|
+ t.string "name", :limit => 20, :null => false
+ t.string "abbrev", :limit => 5
+ end
+
+ add_index "secondary_unit_lookup", ["abbrev"], :name => "secondary_unit_lookup_abbrev_idx"
+
+ create_table "session_info_comments", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "music_session_id", :limit => 64, :null => false
+ t.string "creator_id", :limit => 64, :null => false
+ t.text "comment", :null => false
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "share_tokens", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "token", :limit => 15, :null => false
+ t.string "shareable_id", :limit => 64, :null => false
+ t.string "shareable_type", :limit => 50, :null => false
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ add_index "share_tokens", ["token"], :name => "token_uniqkey", :unique => true
+
+ create_table "shopping_carts", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.integer "quantity", :default => 1, :null => false
+ t.string "user_id", :limit => 64, :null => false
+ t.string "cart_id", :limit => 64, :null => false
+ t.string "cart_class_name", :limit => 64
+ t.string "cart_type", :limit => 64
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "spatial_ref_sys", :id => false, :force => true do |t|
+ t.integer "srid", :null => false
+ t.string "auth_name", :limit => 256
+ t.integer "auth_srid"
+ t.string "srtext", :limit => 2048
+ t.string "proj4text", :limit => 2048
+ end
+
+# Could not dump table "state" because of following StandardError
+# Unknown type 'geometry' for column 'the_geom'
+
+ create_table "state_lookup", :id => false, :force => true do |t|
+ t.integer "st_code", :null => false
+ t.string "name", :limit => 40
+ t.string "abbrev", :limit => 3
+ t.string "statefp", :limit => 2
+ end
+
+ add_index "state_lookup", ["abbrev"], :name => "state_lookup_abbrev_key", :unique => true
+ add_index "state_lookup", ["name"], :name => "state_lookup_name_key", :unique => true
+ add_index "state_lookup", ["statefp"], :name => "state_lookup_statefp_key", :unique => true
+
+ create_table "street_type_lookup", :id => false, :force => true do |t|
+ t.string "name", :limit => 50, :null => false
+ t.string "abbrev", :limit => 50
+ t.boolean "is_hw", :default => false, :null => false
+ end
+
+ add_index "street_type_lookup", ["abbrev"], :name => "street_type_lookup_abbrev_idx"
+
+# Could not dump table "tabblock" because of following StandardError
+# Unknown type 'geometry' for column 'the_geom'
+
+ create_table "text_messages", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "source_user_id", :limit => 64
+ t.string "target_user_id", :limit => 64
+ t.text "message", :null => false
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "topology", :force => true do |t|
+ t.string "name", :limit => nil, :null => false
+ t.integer "srid", :null => false
+ t.float "precision", :null => false
+ t.boolean "hasz", :default => false, :null => false
+ end
+
+ add_index "topology", ["name"], :name => "topology_name_key", :unique => true
+
+ create_table "tracks", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "connection_id", :limit => 64, :null => false
+ t.string "instrument_id", :limit => 64
+ t.string "sound", :limit => 64, :null => false
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.string "client_track_id", :limit => 64, :null => false
+ t.string "client_resource_id", :limit => 100
+ end
+
+# Could not dump table "tract" because of following StandardError
+# Unknown type 'geometry' for column 'the_geom'
+
+ create_table "user_authorizations", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "user_id", :limit => 64
+ t.string "uid", :null => false
+ t.string "provider", :null => false
+ t.string "token", :limit => 2000
+ t.datetime "token_expiration"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.string "secret"
+ end
+
+ add_index "user_authorizations", ["provider", "uid"], :name => "user_authorizations_uniqkey", :unique => true
+ add_index "user_authorizations", ["user_id"], :name => "user_authorizations_user_id_idx"
+
+ create_table "user_presences", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "user_id", :limit => 64, :null => false
+ t.string "type", :limit => 100, :null => false
+ t.string "username", :limit => 100, :null => false
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+# Could not dump table "users" because of following StandardError
+# Unknown type 'json' for column 'mods'
+
+ create_table "video_sources", :id => false, :force => true do |t|
+ t.string "id", :limit => 64, :null => false
+ t.string "connection_id", :limit => 64, :null => false
+ t.string "client_video_source_id", :limit => 64, :null => false
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "wert_snot", :id => false, :force => true do |t|
+ t.integer "count", :limit => 8
+ t.integer "last_jam_locidispid", :limit => 8
+ end
+
+# Could not dump table "zcta5" because of following StandardError
+# Unknown type 'geometry' for column 'the_geom'
+
+ create_table "zip_lookup", :id => false, :force => true do |t|
+ t.integer "zip", :null => false
+ t.integer "st_code"
+ t.string "state", :limit => 2
+ t.integer "co_code"
+ t.string "county", :limit => 90
+ t.integer "cs_code"
+ t.string "cousub", :limit => 90
+ t.integer "pl_code"
+ t.string "place", :limit => 90
+ t.integer "cnt"
+ end
+
+ create_table "zip_lookup_all", :id => false, :force => true do |t|
+ t.integer "zip"
+ t.integer "st_code"
+ t.string "state", :limit => 2
+ t.integer "co_code"
+ t.string "county", :limit => 90
+ t.integer "cs_code"
+ t.string "cousub", :limit => 90
+ t.integer "pl_code"
+ t.string "place", :limit => 90
+ t.integer "cnt"
+ end
+
+ create_table "zip_lookup_base", :id => false, :force => true do |t|
+ t.string "zip", :limit => 5, :null => false
+ t.string "state", :limit => 40
+ t.string "county", :limit => 90
+ t.string "city", :limit => 90
+ t.string "statefp", :limit => 2
+ end
+
+ create_table "zip_state", :id => false, :force => true do |t|
+ t.string "zip", :limit => 5, :null => false
+ t.string "stusps", :limit => 2, :null => false
+ t.string "statefp", :limit => 2
+ end
+
+ create_table "zip_state_loc", :id => false, :force => true do |t|
+ t.string "zip", :limit => 5, :null => false
+ t.string "stusps", :limit => 2, :null => false
+ t.string "statefp", :limit => 2
+ t.string "place", :limit => 100, :null => false
+ end
+
+end
diff --git a/web/db/structure.sql b/web/db/structure.sql
new file mode 100644
index 000000000..4a3422815
--- /dev/null
+++ b/web/db/structure.sql
@@ -0,0 +1,3862 @@
+--
+-- PostgreSQL database dump
+--
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SET check_function_bodies = false;
+SET client_min_messages = warning;
+
+--
+-- Name: pgmigrate; Type: SCHEMA; Schema: -; Owner: -
+--
+
+CREATE SCHEMA pgmigrate;
+
+
+--
+-- Name: tiger; Type: SCHEMA; Schema: -; Owner: -
+--
+
+CREATE SCHEMA tiger;
+
+
+--
+-- Name: fuzzystrmatch; Type: EXTENSION; Schema: -; Owner: -
+--
+
+CREATE EXTENSION IF NOT EXISTS fuzzystrmatch WITH SCHEMA public;
+
+
+--
+-- Name: EXTENSION fuzzystrmatch; Type: COMMENT; Schema: -; Owner: -
+--
+
+COMMENT ON EXTENSION fuzzystrmatch IS 'determine similarities and distance between strings';
+
+
+--
+-- Name: postgis; Type: EXTENSION; Schema: -; Owner: -
+--
+
+CREATE EXTENSION IF NOT EXISTS postgis WITH SCHEMA public;
+
+
+--
+-- Name: EXTENSION postgis; Type: COMMENT; Schema: -; Owner: -
+--
+
+COMMENT ON EXTENSION postgis IS 'PostGIS geometry, geography, and raster spatial types and functions';
+
+
+--
+-- Name: postgis_tiger_geocoder; Type: EXTENSION; Schema: -; Owner: -
+--
+
+CREATE EXTENSION IF NOT EXISTS postgis_tiger_geocoder WITH SCHEMA tiger;
+
+
+--
+-- Name: EXTENSION postgis_tiger_geocoder; Type: COMMENT; Schema: -; Owner: -
+--
+
+COMMENT ON EXTENSION postgis_tiger_geocoder IS 'PostGIS tiger geocoder and reverse geocoder';
+
+
+--
+-- Name: topology; Type: SCHEMA; Schema: -; Owner: -
+--
+
+CREATE SCHEMA topology;
+
+
+--
+-- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: -
+--
+
+CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog;
+
+
+--
+-- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: -
+--
+
+COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';
+
+
+--
+-- Name: postgis_topology; Type: EXTENSION; Schema: -; Owner: -
+--
+
+CREATE EXTENSION IF NOT EXISTS postgis_topology WITH SCHEMA topology;
+
+
+--
+-- Name: EXTENSION postgis_topology; Type: COMMENT; Schema: -; Owner: -
+--
+
+COMMENT ON EXTENSION postgis_topology IS 'PostGIS topology spatial types and functions';
+
+
+--
+-- Name: uuid-ossp; Type: EXTENSION; Schema: -; Owner: -
+--
+
+CREATE EXTENSION IF NOT EXISTS "uuid-ossp" WITH SCHEMA public;
+
+
+--
+-- Name: EXTENSION "uuid-ossp"; Type: COMMENT; Schema: -; Owner: -
+--
+
+COMMENT ON EXTENSION "uuid-ossp" IS 'generate universally unique identifiers (UUIDs)';
+
+
+SET search_path = pgmigrate, pg_catalog;
+
+--
+-- Name: bootstrap_pg_migrate(); Type: FUNCTION; Schema: pgmigrate; Owner: -
+--
+
+CREATE FUNCTION bootstrap_pg_migrate() RETURNS void
+ LANGUAGE plpgsql
+ AS $$ DECLARE found_pg_migrate information_schema.tables; found_pg_migrations information_schema.tables; BEGIN BEGIN SELECT * INTO STRICT found_pg_migrate FROM information_schema.tables WHERE table_name = 'pg_migrate' and table_schema = 'pgmigrate'; EXCEPTION WHEN NO_DATA_FOUND THEN CREATE TABLE pgmigrate.pg_migrate (id BIGSERIAL PRIMARY KEY, template_version VARCHAR(255), builder_version VARCHAR(255), migrator_version VARCHAR(255), database_version VARCHAR(1024)); CREATE INDEX pg_migrate_unique_index ON pgmigrate.pg_migrate (template_version, builder_version, migrator_version, database_version); WHEN TOO_MANY_ROWS THEN RAISE EXCEPTION 'Multiple pg_migrate tables. Unique key on information_schema.tables should have prevented this.'; END; BEGIN SELECT * INTO STRICT found_pg_migrations FROM information_schema.tables WHERE table_name = 'pg_migrations' and table_schema = 'pgmigrate'; EXCEPTION WHEN NO_DATA_FOUND THEN CREATE TABLE pgmigrate.pg_migrations( name VARCHAR(255) PRIMARY KEY, ordinal INTEGER NOT NULL, created TIMESTAMP DEFAULT CURRENT_TIMESTAMP, finalized SMALLINT DEFAULT 1, pg_migrate_id BIGINT NOT NULL REFERENCES pgmigrate.pg_migrate(id)); WHEN TOO_MANY_ROWS THEN RAISE EXCEPTION 'Multiple pg_migrations tables. Unique key on information_schema.tables should have prevented this.'; END; END; $$;
+
+
+--
+-- Name: bypass_existing_migration(character varying); Type: FUNCTION; Schema: pgmigrate; Owner: -
+--
+
+CREATE FUNCTION bypass_existing_migration(migration character varying) RETURNS void
+ LANGUAGE plpgsql
+ AS $_$ DECLARE found_migration pgmigrate.pg_migrations; BEGIN BEGIN EXECUTE 'SELECT * FROM pgmigrate.pg_migrations WHERE name=$1' INTO STRICT found_migration USING migration ; EXCEPTION WHEN NO_DATA_FOUND THEN RETURN; WHEN TOO_MANY_ROWS THEN RAISE EXCEPTION 'pg_migrate: code=pg_migrations_uniqueness_error, migration=%', migration; END; RAISE EXCEPTION 'pg_migrate: code=migration_exists, migration=%', migration; END; $_$;
+
+
+--
+-- Name: record_migration(character varying, integer, character varying, character varying); Type: FUNCTION; Schema: pgmigrate; Owner: -
+--
+
+CREATE FUNCTION record_migration(migration character varying, ordinal integer, template_version character varying, builder_version character varying) RETURNS void
+ LANGUAGE plpgsql
+ AS $_$ DECLARE found_pg_migrate_id BIGINT; migrator_version VARCHAR(255); BEGIN EXECUTE 'SELECT current_setting(''application_name'')' INTO migrator_version; BEGIN EXECUTE 'SELECT id FROM pgmigrate.pg_migrate WHERE template_version=$1 and builder_version=$2 and migrator_version=$3 and database_version=$4' INTO found_pg_migrate_id USING template_version, builder_version, migrator_version, (select version()); EXCEPTION WHEN NO_DATA_FOUND THEN found_pg_migrate_id = NULL; WHEN TOO_MANY_ROWS THEN RAISE EXCEPTION 'pg_migrate: code=pg_migrate_uniqueness_error, migration=%, ordinal=%, template_version=%, builder_version=%, migrator_version=%, database_version', migration, ordinal, template_version, builder_version, migrator_version, (select version()); END; IF found_pg_migrate_id IS NULL THEN INSERT INTO pgmigrate.pg_migrate(id, template_version, builder_version, migrator_version, database_version) VALUES (default, template_version, builder_version, migrator_version, (select version())) RETURNING id INTO found_pg_migrate_id; END IF; EXECUTE 'INSERT INTO pgmigrate.pg_migrations(name, ordinal, created, finalized, pg_migrate_id) VALUES ($1, $2, CURRENT_TIMESTAMP, 1, $3)' USING migration, ordinal, found_pg_migrate_id; END; $_$;
+
+
+--
+-- Name: verify_against_existing_migrations(character varying, integer); Type: FUNCTION; Schema: pgmigrate; Owner: -
+--
+
+CREATE FUNCTION verify_against_existing_migrations(migration character varying, ordinal integer) RETURNS void
+ LANGUAGE plpgsql
+ AS $_$ DECLARE found_migration pgmigrate.pg_migrations; BEGIN BEGIN EXECUTE 'SELECT * FROM pgmigrate.pg_migrations WHERE name=$1' INTO STRICT found_migration USING migration; EXCEPTION WHEN NO_DATA_FOUND THEN IF coalesce((SELECT MAX(p.ordinal) FROM pgmigrate.pg_migrations as p), -1) <> ordinal - 1 THEN RAISE EXCEPTION 'pg_migrate: code=missing_migration, migration=%, ordinal=%, last_ordinal=%', migration, ordinal, (SELECT MAX(p.ordinal) FROM pgmigrate.pg_migrations as p); END IF; RETURN; WHEN TOO_MANY_ROWS THEN RAISE EXCEPTION 'pg_migrate: code=pg_migrations_uniqueness_error, migration=%', migration; END; IF found_migration.ordinal <> ordinal THEN RAISE EXCEPTION 'pg_migrate: code=incorrect_ordinal, migration=%, expected_ordinal=%, actual_ordinal', migration, ordinal, found_migration.ordinal; END IF; END; $_$;
+
+
+--
+-- Name: verify_manifest_is_not_old(integer); Type: FUNCTION; Schema: pgmigrate; Owner: -
+--
+
+CREATE FUNCTION verify_manifest_is_not_old(manifest_version integer) RETURNS void
+ LANGUAGE plpgsql
+ AS $$ DECLARE max_ordinal INTEGER; BEGIN EXECUTE 'SELECT max(ordinal) FROM pgmigrate.pg_migrations' INTO max_ordinal; IF max_ordinal > manifest_version THEN RAISE EXCEPTION 'pg_migrate: code=old_manifest, max_ordinal_in_db=%, manifest_version=%', max_ordinal, manifest_version; END IF; END; $$;
+
+
+SET search_path = public, pg_catalog;
+
+--
+-- Name: bootstrap_users(); Type: FUNCTION; Schema: public; Owner: -
+--
+
+CREATE FUNCTION bootstrap_users() RETURNS void
+ LANGUAGE plpgsql
+ AS $_$ DECLARE test_user VARCHAR(64); BEGIN SELECT id INTO STRICT test_user FROM users WHERE id = '1'; UPDATE users SET first_name = 'Test', last_name = 'User', email = 'test@jamkazam.com', remember_token = 'NQubl-z16Em94tnSdofObw', password_digest = '$2a$10$QyaNTLVX5DAaJ.JL21kDWeUQqdh3Qh7JQbdRgE82x1Cib7HWNcHXC', email_confirmed=true, musician=true WHERE id = '1'; EXCEPTION WHEN NO_DATA_FOUND THEN INSERT INTO users (id, first_name, last_name, email, remember_token, password_digest, email_confirmed, musician) VALUES ('1', 'Test', 'User', 'test@jamkazam.com', 'NQubl-z16Em94tnSdofObw', '$2a$10$QyaNTLVX5DAaJ.JL21kDWeUQqdh3Qh7JQbdRgE82x1Cib7HWNcHXC', true, true); RETURN; WHEN TOO_MANY_ROWS THEN RAISE EXCEPTION 'user id 1 not unique'; END; $_$;
+
+
+--
+-- Name: get_work(bigint); Type: FUNCTION; Schema: public; Owner: -
+--
+
+CREATE FUNCTION get_work(mylocidispid bigint) RETURNS TABLE(client_id character varying)
+ LANGUAGE plpgsql ROWS 5
+ AS $$ BEGIN CREATE TEMPORARY TABLE foo (locidispid BIGINT, locid INT); INSERT INTO foo SELECT DISTINCT locidispid, locidispid/1000000 FROM connections where client_type = 'client'; DELETE FROM foo WHERE locidispid IN (SELECT DISTINCT blocidispid FROM current_scores WHERE alocidispid = mylocidispid AND (current_timestamp - score_dt) < interval '24 hours'); DELETE FROM foo WHERE locid NOT IN (SELECT locid FROM geoiplocations WHERE geog && st_buffer((SELECT geog from geoiplocations WHERE locid = mylocidispid/1000000), 806000)); CREATE TEMPORARY TABLE bar (client_id VARCHAR(64), locidispid BIGINT, r DOUBLE PRECISION); INSERT INTO bar SELECT l.client_id, l.locidispid, random() FROM connections l, foo f WHERE l.locidispid = f.locidispid and l.client_type = 'client'; DROP TABLE foo; DELETE FROM bar b WHERE r != (SELECT max(r) FROM bar b0 WHERE b0.locidispid = b.locidispid); RETURN QUERY SELECT b.client_id FROM bar b ORDER BY r LIMIT 5; DROP TABLE bar; RETURN; END; $$;
+
+
+--
+-- Name: truncate_tables(); Type: FUNCTION; Schema: public; Owner: -
+--
+
+CREATE FUNCTION truncate_tables() RETURNS void
+ LANGUAGE plpgsql
+ AS $$ DECLARE statements CURSOR FOR SELECT tablename FROM pg_tables WHERE schemaname = 'public'; BEGIN FOR stmt IN statements LOOP EXECUTE 'TRUNCATE TABLE ' || quote_ident(stmt.tablename) || ' CASCADE;'; END LOOP; END; $$;
+
+
+--
+-- Name: english_stem; Type: TEXT SEARCH DICTIONARY; Schema: public; Owner: -
+--
+
+CREATE TEXT SEARCH DICTIONARY english_stem (
+ TEMPLATE = pg_catalog.snowball,
+ language = 'english', stopwords = 'english' );
+
+
+--
+-- Name: jamenglish; Type: TEXT SEARCH CONFIGURATION; Schema: public; Owner: -
+--
+
+CREATE TEXT SEARCH CONFIGURATION jamenglish (
+ PARSER = pg_catalog."default" );
+
+ALTER TEXT SEARCH CONFIGURATION jamenglish
+ ADD MAPPING FOR asciiword WITH pg_catalog.english_stem;
+
+ALTER TEXT SEARCH CONFIGURATION jamenglish
+ ADD MAPPING FOR word WITH pg_catalog.english_stem;
+
+ALTER TEXT SEARCH CONFIGURATION jamenglish
+ ADD MAPPING FOR numword WITH simple;
+
+ALTER TEXT SEARCH CONFIGURATION jamenglish
+ ADD MAPPING FOR host WITH simple;
+
+ALTER TEXT SEARCH CONFIGURATION jamenglish
+ ADD MAPPING FOR version WITH simple;
+
+ALTER TEXT SEARCH CONFIGURATION jamenglish
+ ADD MAPPING FOR hword_numpart WITH simple;
+
+ALTER TEXT SEARCH CONFIGURATION jamenglish
+ ADD MAPPING FOR hword_part WITH pg_catalog.english_stem;
+
+ALTER TEXT SEARCH CONFIGURATION jamenglish
+ ADD MAPPING FOR hword_asciipart WITH pg_catalog.english_stem;
+
+ALTER TEXT SEARCH CONFIGURATION jamenglish
+ ADD MAPPING FOR numhword WITH simple;
+
+ALTER TEXT SEARCH CONFIGURATION jamenglish
+ ADD MAPPING FOR asciihword WITH pg_catalog.english_stem;
+
+ALTER TEXT SEARCH CONFIGURATION jamenglish
+ ADD MAPPING FOR hword WITH pg_catalog.english_stem;
+
+ALTER TEXT SEARCH CONFIGURATION jamenglish
+ ADD MAPPING FOR file WITH simple;
+
+ALTER TEXT SEARCH CONFIGURATION jamenglish
+ ADD MAPPING FOR "int" WITH simple;
+
+ALTER TEXT SEARCH CONFIGURATION jamenglish
+ ADD MAPPING FOR uint WITH simple;
+
+
+SET search_path = pgmigrate, pg_catalog;
+
+SET default_tablespace = '';
+
+SET default_with_oids = false;
+
+--
+-- Name: pg_migrate; Type: TABLE; Schema: pgmigrate; Owner: -; Tablespace:
+--
+
+CREATE TABLE pg_migrate (
+ id bigint NOT NULL,
+ template_version character varying(255),
+ builder_version character varying(255),
+ migrator_version character varying(255),
+ database_version character varying(1024)
+);
+
+
+--
+-- Name: pg_migrate_id_seq; Type: SEQUENCE; Schema: pgmigrate; Owner: -
+--
+
+CREATE SEQUENCE pg_migrate_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+
+--
+-- Name: pg_migrate_id_seq; Type: SEQUENCE OWNED BY; Schema: pgmigrate; Owner: -
+--
+
+ALTER SEQUENCE pg_migrate_id_seq OWNED BY pg_migrate.id;
+
+
+--
+-- Name: pg_migrations; Type: TABLE; Schema: pgmigrate; Owner: -; Tablespace:
+--
+
+CREATE TABLE pg_migrations (
+ name character varying(255) NOT NULL,
+ ordinal integer NOT NULL,
+ created timestamp without time zone DEFAULT now(),
+ finalized smallint DEFAULT 1,
+ pg_migrate_id bigint NOT NULL
+);
+
+
+SET search_path = public, pg_catalog;
+
+--
+-- Name: active_admin_comments; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE active_admin_comments (
+ id integer NOT NULL,
+ resource_id character varying(255) NOT NULL,
+ resource_type character varying(255) NOT NULL,
+ author_id integer,
+ author_type character varying(255),
+ body text,
+ created_at timestamp without time zone NOT NULL,
+ updated_at timestamp without time zone NOT NULL,
+ namespace character varying(255)
+);
+
+
+--
+-- Name: active_admin_comments_id_seq; Type: SEQUENCE; Schema: public; Owner: -
+--
+
+CREATE SEQUENCE active_admin_comments_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+
+--
+-- Name: active_admin_comments_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
+--
+
+ALTER SEQUENCE active_admin_comments_id_seq OWNED BY active_admin_comments.id;
+
+
+--
+-- Name: active_music_sessions; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE UNLOGGED TABLE active_music_sessions (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ user_id character varying(64) NOT NULL,
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL,
+ claimed_recording_id character varying(64),
+ claimed_recording_initiator_id character varying(64),
+ track_changes_counter integer DEFAULT 0
+);
+
+
+--
+-- Name: affiliate_partners; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE affiliate_partners (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ partner_name character varying(128) NOT NULL,
+ partner_code character varying(128) NOT NULL,
+ partner_user_id character varying(64) NOT NULL,
+ user_email character varying(255),
+ referral_user_count integer DEFAULT 0 NOT NULL,
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL
+);
+
+
+--
+-- Name: artifact_updates; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE artifact_updates (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ product character varying(255) NOT NULL,
+ version character varying(255) NOT NULL,
+ uri character varying(2000) NOT NULL,
+ sha1 character varying(255) NOT NULL,
+ environment character varying(255) DEFAULT 'public'::character varying NOT NULL,
+ size integer NOT NULL
+);
+
+
+--
+-- Name: band_invitations; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE band_invitations (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ user_id character varying(64),
+ band_id character varying(64),
+ accepted boolean,
+ creator_id character varying(64),
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL
+);
+
+
+--
+-- Name: bands; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE bands (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ name character varying(1024) NOT NULL,
+ website character varying(4000),
+ biography character varying(4000) NOT NULL,
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL,
+ city character varying(100),
+ state character varying(100),
+ country character varying(100),
+ photo_url character varying(2048),
+ logo_url character varying(2048),
+ name_tsv tsvector,
+ original_fpfile_photo character varying(8000) DEFAULT NULL::character varying,
+ cropped_fpfile_photo character varying(8000) DEFAULT NULL::character varying,
+ cropped_s3_path_photo character varying(512) DEFAULT NULL::character varying,
+ crop_selection_photo character varying(256) DEFAULT NULL::character varying,
+ lat numeric(15,10),
+ lng numeric(15,10),
+ large_photo_url character varying(2048),
+ cropped_large_s3_path_photo character varying(512),
+ cropped_large_fpfile_photo character varying(8000),
+ did_real_session boolean DEFAULT false
+);
+
+
+--
+-- Name: bands_genres; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE bands_genres (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ band_id character varying(64) NOT NULL,
+ genre_id character varying(64) NOT NULL,
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL
+);
+
+
+--
+-- Name: bands_musicians; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE bands_musicians (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ band_id character varying(64) NOT NULL,
+ user_id character varying(64) NOT NULL,
+ admin boolean DEFAULT false NOT NULL,
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL
+);
+
+
+--
+-- Name: chat_messages; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE chat_messages (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ user_id character varying(64),
+ music_session_id character varying(64),
+ message text NOT NULL,
+ created_at timestamp without time zone DEFAULT now() NOT NULL
+);
+
+
+--
+-- Name: cities; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE cities (
+ city character varying(255) NOT NULL,
+ region character varying(2) NOT NULL,
+ countrycode character varying(2) NOT NULL
+);
+
+
+--
+-- Name: claimed_recordings; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE claimed_recordings (
+ user_id character varying(64) NOT NULL,
+ recording_id character varying(64) NOT NULL,
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ name character varying(200) NOT NULL,
+ is_public boolean DEFAULT true NOT NULL,
+ genre_id character varying(64) NOT NULL,
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL,
+ description character varying(8000),
+ description_tsv tsvector,
+ name_tsv tsvector
+);
+
+
+--
+-- Name: connections; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE UNLOGGED TABLE connections (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ user_id character varying(64) NOT NULL,
+ client_id character varying(64) NOT NULL,
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL,
+ music_session_id character varying(64),
+ ip_address character varying(64) NOT NULL,
+ as_musician boolean,
+ aasm_state character varying(64) DEFAULT 'idle'::character varying NOT NULL,
+ addr bigint NOT NULL,
+ locidispid bigint NOT NULL,
+ joined_session_at timestamp without time zone,
+ client_type character varying(256) NOT NULL,
+ stale_time integer DEFAULT 40 NOT NULL,
+ expire_time integer DEFAULT 60 NOT NULL
+);
+
+
+--
+-- Name: countries; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE countries (
+ countrycode character varying(2) NOT NULL,
+ countryname character varying(64)
+);
+
+
+--
+-- Name: crash_dumps; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE crash_dumps (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ client_type character varying(64) NOT NULL,
+ client_id character varying(64),
+ user_id character varying(64),
+ session_id character varying(64),
+ "timestamp" timestamp without time zone,
+ uri character varying(1000),
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL,
+ client_version character varying(100) NOT NULL
+);
+
+
+--
+-- Name: scores; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE scores (
+ alocidispid bigint NOT NULL,
+ anodeid character varying(64) NOT NULL,
+ aaddr bigint NOT NULL,
+ blocidispid bigint NOT NULL,
+ bnodeid character varying(64) NOT NULL,
+ baddr bigint NOT NULL,
+ score integer NOT NULL,
+ scorer integer NOT NULL,
+ score_dt timestamp without time zone DEFAULT now() NOT NULL
+);
+
+
+--
+-- Name: current_scores; Type: VIEW; Schema: public; Owner: -
+--
+
+CREATE VIEW current_scores AS
+ SELECT s.alocidispid,
+ s.anodeid,
+ s.aaddr,
+ s.blocidispid,
+ s.bnodeid,
+ s.baddr,
+ s.score,
+ s.scorer,
+ s.score_dt
+ FROM scores s
+ WHERE (s.score_dt = ( SELECT max(s0.score_dt) AS max
+ FROM scores s0
+ WHERE ((s0.alocidispid = s.alocidispid) AND (s0.blocidispid = s.blocidispid))));
+
+
+--
+-- Name: diagnostics; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE diagnostics (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ user_id character varying(64) NOT NULL,
+ type character varying(255) NOT NULL,
+ creator character varying(255) NOT NULL,
+ data text,
+ created_at timestamp without time zone DEFAULT now() NOT NULL
+);
+
+
+--
+-- Name: email_batch_sets; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE email_batch_sets (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ email_batch_id character varying(64),
+ started_at timestamp without time zone,
+ user_ids text DEFAULT ''::text NOT NULL,
+ batch_count integer,
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL,
+ trigger_index integer DEFAULT 0 NOT NULL,
+ sub_type character varying(64),
+ user_id character varying(64)
+);
+
+
+--
+-- Name: email_batches; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE email_batches (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ subject character varying(256),
+ body text,
+ from_email character varying(64) DEFAULT 'noreply@jamkazam.com'::character varying NOT NULL,
+ aasm_state character varying(32) DEFAULT 'pending'::character varying NOT NULL,
+ test_emails text DEFAULT 'test@jamkazam.com'::text NOT NULL,
+ opt_in_count integer DEFAULT 0 NOT NULL,
+ sent_count integer DEFAULT 0 NOT NULL,
+ lock_version integer,
+ started_at timestamp without time zone,
+ completed_at timestamp without time zone,
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL,
+ type character varying(64) DEFAULT 'JamRuby::EmailBatch'::character varying NOT NULL,
+ sub_type character varying(64)
+);
+
+
+--
+-- Name: email_errors; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE email_errors (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ user_id character varying(64),
+ error_type character varying(32),
+ email_address character varying(256),
+ status character varying(32),
+ email_date timestamp without time zone DEFAULT now(),
+ reason text,
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL
+);
+
+
+--
+-- Name: event_sessions; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE event_sessions (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ starts_at timestamp without time zone,
+ ends_at timestamp without time zone,
+ pinned_state character varying(255),
+ img_url character varying(1024),
+ img_width integer,
+ img_height integer,
+ event_id character varying(64),
+ user_id character varying(64),
+ band_id character varying(64),
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL,
+ ordinal integer
+);
+
+
+--
+-- Name: events; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE events (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ slug character varying(512) NOT NULL,
+ title text,
+ description text,
+ show_sponser boolean DEFAULT false NOT NULL,
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL,
+ social_description text
+);
+
+
+--
+-- Name: facebook_signups; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE UNLOGGED TABLE facebook_signups (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ lookup_id character varying(255) NOT NULL,
+ last_name character varying(100),
+ first_name character varying(100),
+ gender character varying(1),
+ email character varying(1024),
+ uid character varying(1024),
+ token character varying(1024),
+ token_expires_at timestamp without time zone,
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL
+);
+
+
+--
+-- Name: fan_invitations; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE fan_invitations (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ sender_id character varying(64),
+ receiver_id character varying(64),
+ music_session_id character varying(64),
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL
+);
+
+
+--
+-- Name: feeds; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE feeds (
+ id bigint NOT NULL,
+ recording_id character varying(64),
+ music_session_id character varying(64),
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL
+);
+
+
+--
+-- Name: feeds_id_seq; Type: SEQUENCE; Schema: public; Owner: -
+--
+
+CREATE SEQUENCE feeds_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+
+--
+-- Name: feeds_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
+--
+
+ALTER SEQUENCE feeds_id_seq OWNED BY feeds.id;
+
+
+--
+-- Name: follows; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE follows (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ user_id character varying(64) NOT NULL,
+ followable_id character varying(64) NOT NULL,
+ followable_type character varying(25) NOT NULL,
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL
+);
+
+
+--
+-- Name: friend_requests; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE friend_requests (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ user_id character varying(64),
+ friend_id character varying(64),
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL,
+ status character varying(50),
+ message character varying(4000)
+);
+
+
+--
+-- Name: friendships; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE friendships (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ user_id character varying(64),
+ friend_id character varying(64),
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL
+);
+
+
+--
+-- Name: genres; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE genres (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ description character varying(1024) NOT NULL,
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL
+);
+
+
+--
+-- Name: genres_music_sessions; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE UNLOGGED TABLE genres_music_sessions (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ genre_id character varying(64),
+ music_session_id character varying(64)
+);
+
+
+--
+-- Name: geoipblocks; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE geoipblocks (
+ beginip bigint NOT NULL,
+ endip bigint NOT NULL,
+ locid integer NOT NULL,
+ geom geometry(Polygon)
+);
+
+
+--
+-- Name: geoipisp; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE geoipisp (
+ beginip bigint NOT NULL,
+ endip bigint NOT NULL,
+ company character varying(50) NOT NULL
+);
+
+
+--
+-- Name: geoiplocations; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE geoiplocations (
+ locid integer NOT NULL,
+ countrycode character varying(2),
+ region character varying(2),
+ city character varying(255),
+ postalcode character varying(8),
+ latitude double precision NOT NULL,
+ longitude double precision NOT NULL,
+ metrocode integer,
+ areacode character(3),
+ geog geography(Point,4326)
+);
+
+
+--
+-- Name: icecast_admin_authentications; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE icecast_admin_authentications (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ source_pass character varying(64) NOT NULL,
+ relay_user character varying(64) NOT NULL,
+ relay_pass character varying(64) NOT NULL,
+ admin_user character varying(64) NOT NULL,
+ admin_pass character varying(64) NOT NULL,
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL
+);
+
+
+--
+-- Name: icecast_directories; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE icecast_directories (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ yp_url_timeout integer DEFAULT 15 NOT NULL,
+ yp_url character varying(1024) NOT NULL,
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL
+);
+
+
+--
+-- Name: icecast_limits; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE icecast_limits (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ clients integer DEFAULT 1000 NOT NULL,
+ sources integer DEFAULT 50 NOT NULL,
+ queue_size integer DEFAULT 102400 NOT NULL,
+ client_timeout integer DEFAULT 30,
+ header_timeout integer DEFAULT 15,
+ source_timeout integer DEFAULT 10,
+ burst_size integer DEFAULT 65536,
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL
+);
+
+
+--
+-- Name: icecast_listen_sockets; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE icecast_listen_sockets (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ port integer DEFAULT 8001 NOT NULL,
+ bind_address character varying(1024),
+ shoutcast_mount character varying(1024),
+ shoutcast_compat integer,
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL
+);
+
+
+--
+-- Name: icecast_loggings; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE icecast_loggings (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ access_log character varying(1024) DEFAULT 'access.log'::character varying NOT NULL,
+ error_log character varying(1024) DEFAULT 'error.log'::character varying NOT NULL,
+ playlist_log character varying(1024),
+ log_level integer DEFAULT 3 NOT NULL,
+ log_archive integer,
+ log_size integer DEFAULT 10000,
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL
+);
+
+
+--
+-- Name: icecast_master_server_relays; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE icecast_master_server_relays (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ master_server character varying(1024) NOT NULL,
+ master_server_port integer DEFAULT 8001 NOT NULL,
+ master_update_interval integer DEFAULT 120 NOT NULL,
+ master_username character varying(64) NOT NULL,
+ master_pass character varying(64) NOT NULL,
+ relays_on_demand integer DEFAULT 1 NOT NULL,
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL
+);
+
+
+--
+-- Name: icecast_mount_templates; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE icecast_mount_templates (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ name character varying(256) NOT NULL,
+ source_username character varying(64),
+ source_pass character varying(64),
+ max_listeners integer DEFAULT 4,
+ max_listener_duration integer DEFAULT 3600,
+ dump_file character varying(1024),
+ intro character varying(1024),
+ fallback_mount character varying(1024),
+ fallback_override integer DEFAULT 1,
+ fallback_when_full integer DEFAULT 1,
+ charset character varying(1024) DEFAULT 'ISO8859-1'::character varying,
+ is_public integer DEFAULT 0,
+ stream_name character varying(1024),
+ stream_description character varying(10000),
+ stream_url character varying(1024),
+ genre character varying(256),
+ bitrate integer,
+ mime_type character varying(64) DEFAULT 'audio/mpeg'::character varying NOT NULL,
+ subtype character varying(64),
+ burst_size integer,
+ mp3_metadata_interval integer,
+ hidden integer DEFAULT 1,
+ on_connect character varying(1024),
+ on_disconnect character varying(1024),
+ authentication_id character varying(64) NOT NULL,
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL
+);
+
+
+--
+-- Name: icecast_mounts; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE UNLOGGED TABLE icecast_mounts (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ name character varying(1024) NOT NULL,
+ source_username character varying(64),
+ source_pass character varying(64),
+ max_listeners integer DEFAULT 4,
+ max_listener_duration integer DEFAULT 3600,
+ dump_file character varying(1024),
+ intro character varying(1024),
+ fallback_mount character varying(1024),
+ fallback_override integer DEFAULT 1,
+ fallback_when_full integer DEFAULT 1,
+ charset character varying(1024) DEFAULT 'ISO8859-1'::character varying,
+ is_public integer DEFAULT 0,
+ stream_name character varying(1024),
+ stream_description character varying(10000),
+ stream_url character varying(1024),
+ genre character varying(256),
+ bitrate integer,
+ mime_type character varying(64),
+ subtype character varying(64),
+ burst_size integer,
+ mp3_metadata_interval integer,
+ hidden integer DEFAULT 1,
+ on_connect character varying(1024),
+ on_disconnect character varying(1024),
+ authentication_id character varying(64) DEFAULT NULL::character varying,
+ listeners integer DEFAULT 0 NOT NULL,
+ sourced boolean DEFAULT false NOT NULL,
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL,
+ music_session_id character varying(64),
+ icecast_server_id character varying(64) NOT NULL,
+ icecast_mount_template_id character varying(64),
+ sourced_needs_changing_at timestamp without time zone
+);
+
+
+--
+-- Name: icecast_paths; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE icecast_paths (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ base_dir character varying(1024) DEFAULT './'::character varying NOT NULL,
+ log_dir character varying(1024) DEFAULT './logs'::character varying NOT NULL,
+ pid_file character varying(1024) DEFAULT './icecast.pid'::character varying,
+ web_root character varying(1024) DEFAULT './web'::character varying NOT NULL,
+ admin_root character varying(1024) DEFAULT './admin'::character varying NOT NULL,
+ allow_ip character varying(1024),
+ deny_ip character varying(1024),
+ alias_source character varying(1024),
+ alias_dest character varying(1024),
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL
+);
+
+
+--
+-- Name: icecast_relays; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE icecast_relays (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ server character varying(1024) NOT NULL,
+ port integer DEFAULT 8001 NOT NULL,
+ mount character varying(1024) NOT NULL,
+ local_mount character varying(1024),
+ relay_username character varying(64),
+ relay_pass character varying(64),
+ relay_shoutcast_metadata integer DEFAULT 0,
+ on_demand integer DEFAULT 1,
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL
+);
+
+
+--
+-- Name: icecast_securities; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE icecast_securities (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ chroot integer DEFAULT 0 NOT NULL,
+ change_owner_user character varying(64),
+ change_owner_group character varying(64),
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL
+);
+
+
+--
+-- Name: icecast_server_groups; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE icecast_server_groups (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ name character varying(255) NOT NULL
+);
+
+
+--
+-- Name: icecast_server_mounts; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE icecast_server_mounts (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ icecast_mount_id character varying(64),
+ icecast_server_id character varying(64),
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL
+);
+
+
+--
+-- Name: icecast_server_relays; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE icecast_server_relays (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ icecast_relay_id character varying(64),
+ icecast_server_id character varying(64),
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL
+);
+
+
+--
+-- Name: icecast_server_sockets; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE icecast_server_sockets (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ icecast_listen_socket_id character varying(64),
+ icecast_server_id character varying(64),
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL
+);
+
+
+--
+-- Name: icecast_servers; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE icecast_servers (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ config_changed integer DEFAULT 0,
+ limit_id character varying(64),
+ admin_auth_id character varying(64),
+ directory_id character varying(64),
+ master_relay_id character varying(64),
+ path_id character varying(64),
+ logging_id character varying(64),
+ security_id character varying(64),
+ template_id character varying(64) NOT NULL,
+ hostname character varying(1024) NOT NULL,
+ server_id character varying(1024) NOT NULL,
+ location character varying(1024),
+ admin_email character varying(1024),
+ fileserve integer,
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL,
+ icecast_server_group_id character varying(64) DEFAULT 'default'::character varying NOT NULL,
+ mount_template_id character varying(64),
+ config_updated_at timestamp without time zone
+);
+
+
+--
+-- Name: icecast_template_sockets; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE icecast_template_sockets (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ icecast_listen_socket_id character varying(64),
+ icecast_template_id character varying(64),
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL
+);
+
+
+--
+-- Name: icecast_templates; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE icecast_templates (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ limit_id character varying(64),
+ admin_auth_id character varying(64),
+ directory_id character varying(64),
+ master_relay_id character varying(64),
+ path_id character varying(64),
+ logging_id character varying(64),
+ security_id character varying(64),
+ location character varying(1024) NOT NULL,
+ name character varying(256) NOT NULL,
+ admin_email character varying(1024) DEFAULT 'admin@jamkazam.com'::character varying NOT NULL,
+ fileserve integer DEFAULT 1 NOT NULL,
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL
+);
+
+
+--
+-- Name: icecast_user_authentications; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE UNLOGGED TABLE icecast_user_authentications (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ authentication_type character varying(16) DEFAULT 'url'::character varying,
+ filename character varying(1024),
+ allow_duplicate_users integer,
+ mount_add character varying(1024),
+ mount_remove character varying(1024),
+ listener_add character varying(1024),
+ listener_remove character varying(1024),
+ unused_username character varying(64),
+ unused_pass character varying(64),
+ auth_header character varying(64) DEFAULT 'icecast-auth-user: 1'::character varying,
+ timelimit_header character varying(64) DEFAULT 'icecast-auth-timelimit:'::character varying,
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL
+);
+
+
+--
+-- Name: instruments; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE instruments (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ description character varying(1024) NOT NULL,
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL,
+ popularity integer DEFAULT 0 NOT NULL
+);
+
+
+--
+-- Name: invitations; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE UNLOGGED TABLE invitations (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ sender_id character varying(64),
+ receiver_id character varying(64),
+ music_session_id character varying(64),
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL,
+ join_request_id character varying(64)
+);
+
+
+--
+-- Name: invited_users; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE invited_users (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ sender_id character varying(64),
+ autofriend boolean NOT NULL,
+ email character varying(256),
+ invitation_code character varying(256) NOT NULL,
+ accepted boolean DEFAULT false,
+ note text,
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL,
+ invite_medium character varying(64)
+);
+
+
+--
+-- Name: isp_score_batch; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE isp_score_batch (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ json_scoring_data text NOT NULL,
+ created_at timestamp without time zone DEFAULT now() NOT NULL
+);
+
+
+--
+-- Name: jamcompany; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE jamcompany (
+ coid integer NOT NULL,
+ company character varying(50) NOT NULL
+);
+
+
+--
+-- Name: jamcompany_coid_seq; Type: SEQUENCE; Schema: public; Owner: -
+--
+
+CREATE SEQUENCE jamcompany_coid_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+
+--
+-- Name: jamcompany_coid_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
+--
+
+ALTER SEQUENCE jamcompany_coid_seq OWNED BY jamcompany.coid;
+
+
+--
+-- Name: jamisp; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE jamisp (
+ beginip bigint NOT NULL,
+ endip bigint NOT NULL,
+ coid integer NOT NULL,
+ geom geometry(Polygon)
+);
+
+
+--
+-- Name: join_requests; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE UNLOGGED TABLE join_requests (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ user_id character varying(64),
+ music_session_id character varying(64),
+ text character varying(2000),
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL
+);
+
+
+--
+-- Name: likes; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE likes (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ user_id character varying(64) NOT NULL,
+ likable_id character varying(64) NOT NULL,
+ likable_type character varying(25) NOT NULL,
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL
+);
+
+
+--
+-- Name: max_mind_geo; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE max_mind_geo (
+ country character varying(2) NOT NULL,
+ region character varying(2) NOT NULL,
+ city character varying(255) NOT NULL,
+ lat numeric(15,10) NOT NULL,
+ lng numeric(15,10) NOT NULL,
+ ip_start bigint NOT NULL,
+ ip_end bigint NOT NULL
+);
+
+
+--
+-- Name: max_mind_isp; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE max_mind_isp (
+ ip_bottom bigint NOT NULL,
+ ip_top bigint NOT NULL,
+ isp character varying(64) NOT NULL,
+ country character varying(2) NOT NULL
+);
+
+
+--
+-- Name: tracks_next_tracker_seq; Type: SEQUENCE; Schema: public; Owner: -
+--
+
+CREATE SEQUENCE tracks_next_tracker_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+
+--
+-- Name: mixes; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE mixes (
+ id bigint DEFAULT nextval('tracks_next_tracker_seq'::regclass) NOT NULL,
+ recording_id character varying(64) NOT NULL,
+ mix_server character varying(64) DEFAULT NULL::character varying,
+ started_at timestamp without time zone,
+ completed_at timestamp without time zone,
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL,
+ ogg_md5 character varying(100),
+ ogg_length integer,
+ ogg_url character varying(1024),
+ completed boolean DEFAULT false NOT NULL,
+ error_count integer DEFAULT 0 NOT NULL,
+ error_reason text,
+ error_detail text,
+ should_retry boolean DEFAULT false NOT NULL,
+ mp3_md5 character varying(100),
+ mp3_length integer,
+ mp3_url character varying(1024),
+ download_count integer DEFAULT 0 NOT NULL,
+ last_downloaded_at timestamp without time zone
+);
+
+
+--
+-- Name: music_session_perf_data; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE music_session_perf_data (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ music_session_id character varying(64),
+ client_id character varying(64),
+ uri character varying(1000),
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL
+);
+
+
+--
+-- Name: music_sessions; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE music_sessions (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ music_session_id character varying(64),
+ description character varying(8000),
+ user_id character varying(64) NOT NULL,
+ band_id character varying(64),
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ session_removed_at timestamp without time zone DEFAULT now(),
+ play_count integer DEFAULT 0 NOT NULL,
+ like_count integer DEFAULT 0 NOT NULL,
+ fan_access boolean DEFAULT true NOT NULL,
+ scheduled_start timestamp with time zone,
+ scheduled_duration interval,
+ musician_access boolean DEFAULT true NOT NULL,
+ approval_required boolean DEFAULT false NOT NULL,
+ fan_chat boolean DEFAULT true NOT NULL,
+ genre_id character varying(64) NOT NULL,
+ legal_policy character varying(255) DEFAULT 'standard'::character varying NOT NULL,
+ language character varying(255) DEFAULT 'en'::character varying NOT NULL,
+ name text NOT NULL,
+ recurring_session_id character varying(64)
+);
+
+
+--
+-- Name: music_sessions_comments; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE music_sessions_comments (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ creator_id character varying(64) NOT NULL,
+ comment character varying(4000) NOT NULL,
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL,
+ ip_address inet,
+ music_session_id character varying(64)
+);
+
+
+--
+-- Name: music_sessions_likers; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE music_sessions_likers (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ liker_id character varying(64),
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL,
+ ip_address inet,
+ music_session_id character varying(64)
+);
+
+
+--
+-- Name: music_sessions_user_history; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE music_sessions_user_history (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ user_id character varying(64) NOT NULL,
+ client_id character varying(64) NOT NULL,
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ session_removed_at timestamp without time zone,
+ max_concurrent_connections integer,
+ rating integer,
+ instruments character varying(255),
+ rating_comment text,
+ music_session_id character varying(64)
+);
+
+
+--
+-- Name: musicians_instruments; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE musicians_instruments (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ user_id character varying(64) NOT NULL,
+ instrument_id character varying(64) NOT NULL,
+ proficiency_level smallint NOT NULL,
+ priority smallint DEFAULT 1 NOT NULL,
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL
+);
+
+
+--
+-- Name: notifications; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE notifications (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ description character varying(32) NOT NULL,
+ source_user_id character varying(64),
+ target_user_id character varying(64),
+ band_id character varying(64),
+ session_id character varying(64),
+ recording_id character varying(64),
+ invitation_id character varying(64),
+ join_request_id character varying(64),
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL,
+ friend_request_id character varying(64),
+ band_invitation_id character varying(64),
+ message text
+);
+
+
+--
+-- Name: playable_plays; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE playable_plays (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ playable_id character varying(64) NOT NULL,
+ playable_type character varying(128) NOT NULL,
+ player_id character varying(64),
+ claimed_recording_id character varying(64),
+ ip_address inet,
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL
+);
+
+
+--
+-- Name: promotionals; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE promotionals (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ type character varying(128) DEFAULT 'JamRuby::PromoBuzz'::character varying NOT NULL,
+ aasm_state character varying(64) DEFAULT 'hidden'::character varying,
+ "position" integer DEFAULT 0 NOT NULL,
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL,
+ latest_id character varying(64) DEFAULT NULL::character varying,
+ latest_type character varying(128) DEFAULT NULL::character varying,
+ image character varying(1024) DEFAULT NULL::character varying,
+ text_short character varying(512) DEFAULT NULL::character varying,
+ text_long character varying(4096) DEFAULT NULL::character varying
+);
+
+
+--
+-- Name: recorded_tracks; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE recorded_tracks (
+ id bigint DEFAULT nextval('tracks_next_tracker_seq'::regclass) NOT NULL,
+ user_id character varying(64) NOT NULL,
+ instrument_id character varying(64) NOT NULL,
+ sound character varying(64) NOT NULL,
+ next_part_to_upload integer DEFAULT 0 NOT NULL,
+ fully_uploaded boolean DEFAULT false NOT NULL,
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL,
+ upload_id character varying(1024),
+ recording_id character varying(64) NOT NULL,
+ md5 character varying(100),
+ length bigint,
+ client_id character varying(64) NOT NULL,
+ track_id character varying(64) NOT NULL,
+ url character varying(1024),
+ file_offset bigint DEFAULT 0,
+ client_track_id character varying(64) NOT NULL,
+ is_part_uploading boolean DEFAULT false NOT NULL,
+ upload_failures integer DEFAULT 0 NOT NULL,
+ part_failures integer DEFAULT 0 NOT NULL,
+ discard boolean,
+ download_count integer DEFAULT 0 NOT NULL,
+ last_downloaded_at timestamp without time zone
+);
+
+
+--
+-- Name: recordings; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE recordings (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL,
+ owner_id character varying(64) NOT NULL,
+ music_session_id character varying(64),
+ band_id character varying(64),
+ duration integer,
+ is_done boolean DEFAULT false,
+ all_discarded boolean DEFAULT false NOT NULL,
+ name character varying(1024),
+ play_count integer DEFAULT 0 NOT NULL,
+ like_count integer DEFAULT 0 NOT NULL
+);
+
+
+--
+-- Name: recordings_comments; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE recordings_comments (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ recording_id character varying(64) NOT NULL,
+ creator_id character varying(64) NOT NULL,
+ comment character varying(4000) NOT NULL,
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL,
+ ip_address inet
+);
+
+
+--
+-- Name: recordings_downloads; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE recordings_downloads (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ recording_id character varying(64) NOT NULL,
+ downloader_id character varying(64) NOT NULL,
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL
+);
+
+
+--
+-- Name: recordings_likers; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE recordings_likers (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ recording_id character varying(64) NOT NULL,
+ liker_id character varying(64),
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL,
+ ip_address inet,
+ claimed_recording_id character varying(64) NOT NULL,
+ favorite boolean DEFAULT true NOT NULL
+);
+
+
+--
+-- Name: recurring_sessions; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE recurring_sessions (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ description character varying(8000),
+ scheduled_start timestamp with time zone,
+ scheduled_duration interval,
+ musician_access boolean NOT NULL,
+ approval_required boolean NOT NULL,
+ fan_chat boolean NOT NULL,
+ genre_id character varying(64),
+ legal_policy character varying(255) DEFAULT 'standard'::character varying NOT NULL,
+ language character varying(255) DEFAULT 'en'::character varying NOT NULL,
+ name text,
+ user_id character varying(64) NOT NULL,
+ band_id character varying(64),
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL
+);
+
+
+--
+-- Name: regions; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE regions (
+ region character varying(2) NOT NULL,
+ regionname character varying(64),
+ countrycode character varying(2) NOT NULL
+);
+
+
+--
+-- Name: rsvp_requests; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE rsvp_requests (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ user_id character varying(64) NOT NULL,
+ rsvp_slot_id character varying(64) NOT NULL,
+ message text,
+ chosen boolean DEFAULT false,
+ canceled boolean DEFAULT false,
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL
+);
+
+
+--
+-- Name: rsvp_slots; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE rsvp_slots (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ instrument_id character varying(64),
+ proficiency_level character varying(255) NOT NULL,
+ music_session_id character varying(64) NOT NULL,
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL
+);
+
+
+--
+-- Name: share_tokens; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE share_tokens (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ token character varying(15) NOT NULL,
+ shareable_id character varying(64) NOT NULL,
+ shareable_type character varying(50) NOT NULL,
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL
+);
+
+
+--
+-- Name: tracks; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE UNLOGGED TABLE tracks (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ connection_id character varying(64) NOT NULL,
+ instrument_id character varying(64),
+ sound character varying(64) NOT NULL,
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL,
+ client_track_id character varying(64) NOT NULL
+);
+
+
+--
+-- Name: user_authorizations; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE user_authorizations (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ user_id character varying(64),
+ uid character varying(255) NOT NULL,
+ provider character varying(255) NOT NULL,
+ token character varying(255),
+ token_expiration timestamp without time zone,
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL,
+ secret character varying(255)
+);
+
+
+--
+-- Name: users; Type: TABLE; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE TABLE users (
+ id character varying(64) DEFAULT uuid_generate_v4() NOT NULL,
+ email character varying(255) NOT NULL,
+ remember_token character varying(255),
+ encrypted_password character varying(255) NOT NULL,
+ admin boolean DEFAULT false NOT NULL,
+ created_at timestamp without time zone DEFAULT now() NOT NULL,
+ updated_at timestamp without time zone DEFAULT now() NOT NULL,
+ musician boolean DEFAULT false NOT NULL,
+ city character varying(100),
+ state character varying(100),
+ country character varying(100),
+ first_name character varying(50),
+ last_name character varying(50),
+ birth_date date,
+ gender character(1),
+ internet_service_provider character varying(50),
+ signup_token character varying(255),
+ email_confirmed boolean DEFAULT false,
+ photo_url character varying(2048),
+ session_settings character varying(4000),
+ reset_password_token character varying(64),
+ reset_password_token_created timestamp without time zone,
+ can_invite boolean DEFAULT true NOT NULL,
+ name_tsv tsvector,
+ environment character varying(255) DEFAULT 'public'::character varying NOT NULL,
+ subscribe_email boolean DEFAULT true,
+ update_email character varying(1024),
+ update_email_token character varying(1024),
+ original_fpfile character varying(8000) DEFAULT NULL::character varying,
+ cropped_fpfile character varying(8000) DEFAULT NULL::character varying,
+ cropped_s3_path character varying(512) DEFAULT NULL::character varying,
+ crop_selection character varying(256) DEFAULT NULL::character varying,
+ last_failed_certified_gear_at timestamp without time zone,
+ last_failed_certified_gear_reason character varying(256),
+ first_downloaded_client_at timestamp without time zone,
+ first_ran_client_at timestamp without time zone,
+ first_certified_gear_at timestamp without time zone,
+ first_music_session_at timestamp without time zone,
+ first_real_music_session_at timestamp without time zone,
+ first_good_music_session_at timestamp without time zone,
+ first_invited_at timestamp without time zone,
+ first_friended_at timestamp without time zone,
+ first_social_promoted_at timestamp without time zone,
+ show_whats_next boolean DEFAULT true,
+ biography text,
+ lat numeric(15,10),
+ lng numeric(15,10),
+ icecast_server_group_id character varying(64) DEFAULT 'default'::character varying NOT NULL,
+ first_recording_at timestamp without time zone,
+ large_photo_url character varying(2048),
+ cropped_large_s3_path character varying(512),
+ cropped_large_fpfile character varying(8000),
+ addr bigint DEFAULT 0 NOT NULL,
+ locidispid bigint DEFAULT 0 NOT NULL,
+ notification_seen_at timestamp without time zone,
+ affiliate_referral_id character varying(64),
+ mods json,
+ audio_latency double precision,
+ last_jam_addr bigint,
+ last_jam_locidispid bigint,
+ last_jam_updated_reason character(1),
+ last_jam_updated_at timestamp without time zone
+);
+
+
+SET search_path = pgmigrate, pg_catalog;
+
+--
+-- Name: id; Type: DEFAULT; Schema: pgmigrate; Owner: -
+--
+
+ALTER TABLE ONLY pg_migrate ALTER COLUMN id SET DEFAULT nextval('pg_migrate_id_seq'::regclass);
+
+
+SET search_path = public, pg_catalog;
+
+--
+-- Name: id; Type: DEFAULT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY active_admin_comments ALTER COLUMN id SET DEFAULT nextval('active_admin_comments_id_seq'::regclass);
+
+
+--
+-- Name: id; Type: DEFAULT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY feeds ALTER COLUMN id SET DEFAULT nextval('feeds_id_seq'::regclass);
+
+
+--
+-- Name: coid; Type: DEFAULT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY jamcompany ALTER COLUMN coid SET DEFAULT nextval('jamcompany_coid_seq'::regclass);
+
+
+SET search_path = pgmigrate, pg_catalog;
+
+--
+-- Name: pg_migrate_pkey; Type: CONSTRAINT; Schema: pgmigrate; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY pg_migrate
+ ADD CONSTRAINT pg_migrate_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: pg_migrations_pkey; Type: CONSTRAINT; Schema: pgmigrate; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY pg_migrations
+ ADD CONSTRAINT pg_migrations_pkey PRIMARY KEY (name);
+
+
+SET search_path = public, pg_catalog;
+
+--
+-- Name: admin_comments_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY active_admin_comments
+ ADD CONSTRAINT admin_comments_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: affiliate_partners_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY affiliate_partners
+ ADD CONSTRAINT affiliate_partners_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: artifact_updates_uniqkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY artifact_updates
+ ADD CONSTRAINT artifact_updates_uniqkey UNIQUE (product, version);
+
+
+--
+-- Name: band_genre_uniqkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY bands_genres
+ ADD CONSTRAINT band_genre_uniqkey UNIQUE (band_id, genre_id);
+
+
+--
+-- Name: band_invitations_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY band_invitations
+ ADD CONSTRAINT band_invitations_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: band_musician_uniqkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY bands_musicians
+ ADD CONSTRAINT band_musician_uniqkey UNIQUE (band_id, user_id);
+
+
+--
+-- Name: bands_genres_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY bands_genres
+ ADD CONSTRAINT bands_genres_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: bands_musicians_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY bands_musicians
+ ADD CONSTRAINT bands_musicians_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: bands_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY bands
+ ADD CONSTRAINT bands_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: claimed_recordings_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY claimed_recordings
+ ADD CONSTRAINT claimed_recordings_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: connections_client_id_key; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY connections
+ ADD CONSTRAINT connections_client_id_key UNIQUE (client_id);
+
+
+--
+-- Name: connections_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY connections
+ ADD CONSTRAINT connections_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: crash_dumps_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY crash_dumps
+ ADD CONSTRAINT crash_dumps_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: email_batch_set_uniqkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY email_batch_sets
+ ADD CONSTRAINT email_batch_set_uniqkey UNIQUE (email_batch_id, started_at);
+
+
+--
+-- Name: email_batch_sets_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY email_batch_sets
+ ADD CONSTRAINT email_batch_sets_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: email_batches_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY email_batches
+ ADD CONSTRAINT email_batches_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: email_errors_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY email_errors
+ ADD CONSTRAINT email_errors_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: event_sessions_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY event_sessions
+ ADD CONSTRAINT event_sessions_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: events_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY events
+ ADD CONSTRAINT events_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: events_slug_key; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY events
+ ADD CONSTRAINT events_slug_key UNIQUE (slug);
+
+
+--
+-- Name: facebook_signups_lookup_id_key; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY facebook_signups
+ ADD CONSTRAINT facebook_signups_lookup_id_key UNIQUE (lookup_id);
+
+
+--
+-- Name: facebook_signups_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY facebook_signups
+ ADD CONSTRAINT facebook_signups_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: fan_invitations_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY fan_invitations
+ ADD CONSTRAINT fan_invitations_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: feeds_music_session_id_key; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY feeds
+ ADD CONSTRAINT feeds_music_session_id_key UNIQUE (music_session_id);
+
+
+--
+-- Name: feeds_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY feeds
+ ADD CONSTRAINT feeds_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: feeds_recording_id_key; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY feeds
+ ADD CONSTRAINT feeds_recording_id_key UNIQUE (recording_id);
+
+
+--
+-- Name: follows_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY follows
+ ADD CONSTRAINT follows_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: follows_user_uniqkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY follows
+ ADD CONSTRAINT follows_user_uniqkey UNIQUE (user_id, followable_id);
+
+
+--
+-- Name: friend_requests_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY friend_requests
+ ADD CONSTRAINT friend_requests_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: friendships_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY friendships
+ ADD CONSTRAINT friendships_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: genres_music_sessions_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY genres_music_sessions
+ ADD CONSTRAINT genres_music_sessions_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: genres_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY genres
+ ADD CONSTRAINT genres_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: geoiplocations_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY geoiplocations
+ ADD CONSTRAINT geoiplocations_pkey PRIMARY KEY (locid);
+
+
+--
+-- Name: icecast_admin_authentications_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY icecast_admin_authentications
+ ADD CONSTRAINT icecast_admin_authentications_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: icecast_directories_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY icecast_directories
+ ADD CONSTRAINT icecast_directories_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: icecast_limits_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY icecast_limits
+ ADD CONSTRAINT icecast_limits_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: icecast_listen_sockets_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY icecast_listen_sockets
+ ADD CONSTRAINT icecast_listen_sockets_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: icecast_loggings_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY icecast_loggings
+ ADD CONSTRAINT icecast_loggings_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: icecast_master_server_relays_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY icecast_master_server_relays
+ ADD CONSTRAINT icecast_master_server_relays_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: icecast_mount_templates_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY icecast_mount_templates
+ ADD CONSTRAINT icecast_mount_templates_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: icecast_mounts_name_key; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY icecast_mounts
+ ADD CONSTRAINT icecast_mounts_name_key UNIQUE (name);
+
+
+--
+-- Name: icecast_mounts_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY icecast_mounts
+ ADD CONSTRAINT icecast_mounts_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: icecast_paths_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY icecast_paths
+ ADD CONSTRAINT icecast_paths_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: icecast_relays_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY icecast_relays
+ ADD CONSTRAINT icecast_relays_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: icecast_securities_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY icecast_securities
+ ADD CONSTRAINT icecast_securities_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: icecast_server_groups_name_key; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY icecast_server_groups
+ ADD CONSTRAINT icecast_server_groups_name_key UNIQUE (name);
+
+
+--
+-- Name: icecast_server_groups_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY icecast_server_groups
+ ADD CONSTRAINT icecast_server_groups_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: icecast_server_mounts_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY icecast_server_mounts
+ ADD CONSTRAINT icecast_server_mounts_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: icecast_server_relays_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY icecast_server_relays
+ ADD CONSTRAINT icecast_server_relays_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: icecast_server_sockets_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY icecast_server_sockets
+ ADD CONSTRAINT icecast_server_sockets_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: icecast_servers_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY icecast_servers
+ ADD CONSTRAINT icecast_servers_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: icecast_servers_server_id_key; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY icecast_servers
+ ADD CONSTRAINT icecast_servers_server_id_key UNIQUE (server_id);
+
+
+--
+-- Name: icecast_template_sockets_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY icecast_template_sockets
+ ADD CONSTRAINT icecast_template_sockets_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: icecast_templates_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY icecast_templates
+ ADD CONSTRAINT icecast_templates_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: icecast_user_authentications_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY icecast_user_authentications
+ ADD CONSTRAINT icecast_user_authentications_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: instruments_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY instruments
+ ADD CONSTRAINT instruments_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: invitations_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY invitations
+ ADD CONSTRAINT invitations_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: invitations_uniqkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY invitations
+ ADD CONSTRAINT invitations_uniqkey UNIQUE (sender_id, receiver_id, music_session_id);
+
+
+--
+-- Name: invited_users_invitation_code_key; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY invited_users
+ ADD CONSTRAINT invited_users_invitation_code_key UNIQUE (invitation_code);
+
+
+--
+-- Name: invited_users_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY invited_users
+ ADD CONSTRAINT invited_users_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: isp_score_batch_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY isp_score_batch
+ ADD CONSTRAINT isp_score_batch_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: jamcompany_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY jamcompany
+ ADD CONSTRAINT jamcompany_pkey PRIMARY KEY (coid);
+
+
+--
+-- Name: join_requests_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY join_requests
+ ADD CONSTRAINT join_requests_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: likes_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY likes
+ ADD CONSTRAINT likes_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: likes_user_uniqkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY likes
+ ADD CONSTRAINT likes_user_uniqkey UNIQUE (user_id, likable_id);
+
+
+--
+-- Name: mixes_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY mixes
+ ADD CONSTRAINT mixes_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: music_session_perf_data_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY music_session_perf_data
+ ADD CONSTRAINT music_session_perf_data_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: music_session_uniqkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY music_sessions
+ ADD CONSTRAINT music_session_uniqkey UNIQUE (music_session_id);
+
+
+--
+-- Name: music_sessions_comments_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY music_sessions_comments
+ ADD CONSTRAINT music_sessions_comments_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: music_sessions_history_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY music_sessions
+ ADD CONSTRAINT music_sessions_history_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: music_sessions_likers_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY music_sessions_likers
+ ADD CONSTRAINT music_sessions_likers_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: music_sessions_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY active_music_sessions
+ ADD CONSTRAINT music_sessions_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: musician_instrument_uniqkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY musicians_instruments
+ ADD CONSTRAINT musician_instrument_uniqkey UNIQUE (user_id, instrument_id);
+
+
+--
+-- Name: musician_recording_uniqkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY claimed_recordings
+ ADD CONSTRAINT musician_recording_uniqkey UNIQUE (user_id, recording_id);
+
+
+--
+-- Name: musicians_instruments_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY musicians_instruments
+ ADD CONSTRAINT musicians_instruments_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: notifications_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY notifications
+ ADD CONSTRAINT notifications_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: playable_plays_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY playable_plays
+ ADD CONSTRAINT playable_plays_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: promotionals_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY promotionals
+ ADD CONSTRAINT promotionals_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: recording_liker_uniqkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY recordings_likers
+ ADD CONSTRAINT recording_liker_uniqkey UNIQUE (recording_id, liker_id);
+
+
+--
+-- Name: recordings_comments_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY recordings_comments
+ ADD CONSTRAINT recordings_comments_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: recordings_downloads_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY recordings_downloads
+ ADD CONSTRAINT recordings_downloads_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: recordings_likers_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY recordings_likers
+ ADD CONSTRAINT recordings_likers_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: recordings_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY recordings
+ ADD CONSTRAINT recordings_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: recurring_sessions_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY recurring_sessions
+ ADD CONSTRAINT recurring_sessions_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: rsvp_requests_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY rsvp_requests
+ ADD CONSTRAINT rsvp_requests_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: rsvp_slots_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY rsvp_slots
+ ADD CONSTRAINT rsvp_slots_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: saved_tracks_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY recorded_tracks
+ ADD CONSTRAINT saved_tracks_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: server_mount_uniqkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY icecast_server_mounts
+ ADD CONSTRAINT server_mount_uniqkey UNIQUE (icecast_mount_id, icecast_server_id);
+
+
+--
+-- Name: server_relay_uniqkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY icecast_server_relays
+ ADD CONSTRAINT server_relay_uniqkey UNIQUE (icecast_relay_id, icecast_server_id);
+
+
+--
+-- Name: server_socket_uniqkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY icecast_server_sockets
+ ADD CONSTRAINT server_socket_uniqkey UNIQUE (icecast_listen_socket_id, icecast_server_id);
+
+
+--
+-- Name: share_tokens_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY share_tokens
+ ADD CONSTRAINT share_tokens_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: template_socket_uniqkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY icecast_template_sockets
+ ADD CONSTRAINT template_socket_uniqkey UNIQUE (icecast_listen_socket_id, icecast_template_id);
+
+
+--
+-- Name: token_uniqkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY share_tokens
+ ADD CONSTRAINT token_uniqkey UNIQUE (token);
+
+
+--
+-- Name: tracks_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY tracks
+ ADD CONSTRAINT tracks_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: user_authorizations_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY user_authorizations
+ ADD CONSTRAINT user_authorizations_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: user_authorizations_uniqkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY user_authorizations
+ ADD CONSTRAINT user_authorizations_uniqkey UNIQUE (provider, uid);
+
+
+--
+-- Name: user_friend_uniqkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY friendships
+ ADD CONSTRAINT user_friend_uniqkey UNIQUE (user_id, friend_id);
+
+
+--
+-- Name: user_music_session_uniqkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY join_requests
+ ADD CONSTRAINT user_music_session_uniqkey UNIQUE (user_id, music_session_id);
+
+
+--
+-- Name: users_email_key; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY users
+ ADD CONSTRAINT users_email_key UNIQUE (email);
+
+
+--
+-- Name: users_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY users
+ ADD CONSTRAINT users_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: users_remember_token_key; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY users
+ ADD CONSTRAINT users_remember_token_key UNIQUE (remember_token);
+
+
+--
+-- Name: users_signup_token_key; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY users
+ ADD CONSTRAINT users_signup_token_key UNIQUE (signup_token);
+
+
+--
+-- Name: users_update_email_token_key; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
+--
+
+ALTER TABLE ONLY users
+ ADD CONSTRAINT users_update_email_token_key UNIQUE (update_email_token);
+
+
+SET search_path = pgmigrate, pg_catalog;
+
+--
+-- Name: pg_migrate_unique_index; Type: INDEX; Schema: pgmigrate; Owner: -; Tablespace:
+--
+
+CREATE INDEX pg_migrate_unique_index ON pg_migrate USING btree (template_version, builder_version, migrator_version, database_version);
+
+
+SET search_path = public, pg_catalog;
+
+--
+-- Name: affiliate_partners_code_idx; Type: INDEX; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE INDEX affiliate_partners_code_idx ON affiliate_partners USING btree (partner_code);
+
+
+--
+-- Name: affiliate_partners_user_idx; Type: INDEX; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE INDEX affiliate_partners_user_idx ON affiliate_partners USING btree (partner_user_id);
+
+
+--
+-- Name: bands_name_tsv_index; Type: INDEX; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE INDEX bands_name_tsv_index ON bands USING gin (name_tsv);
+
+
+--
+-- Name: claimed_recordings_description_tsv_index; Type: INDEX; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE INDEX claimed_recordings_description_tsv_index ON claimed_recordings USING gin (description_tsv);
+
+
+--
+-- Name: claimed_recordings_name_tsv_index; Type: INDEX; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE INDEX claimed_recordings_name_tsv_index ON claimed_recordings USING gin (name_tsv);
+
+
+--
+-- Name: connections_locidispid_ndx; Type: INDEX; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE INDEX connections_locidispid_ndx ON connections USING btree (locidispid);
+
+
+--
+-- Name: crash_dumps_client_id_idx; Type: INDEX; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE INDEX crash_dumps_client_id_idx ON crash_dumps USING btree (client_id);
+
+
+--
+-- Name: crash_dumps_timestamp_idx; Type: INDEX; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE INDEX crash_dumps_timestamp_idx ON crash_dumps USING btree ("timestamp");
+
+
+--
+-- Name: crash_dumps_user_id_idx; Type: INDEX; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE INDEX crash_dumps_user_id_idx ON crash_dumps USING btree (user_id);
+
+
+--
+-- Name: diagnostics_type_idx; Type: INDEX; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE INDEX diagnostics_type_idx ON diagnostics USING btree (type);
+
+
+--
+-- Name: email_batch_set_fkidx; Type: INDEX; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE INDEX email_batch_set_fkidx ON email_batch_sets USING btree (email_batch_id);
+
+
+--
+-- Name: email_batch_sets_progress_idx; Type: INDEX; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE INDEX email_batch_sets_progress_idx ON email_batch_sets USING btree (user_id, sub_type);
+
+
+--
+-- Name: email_error_address_idx; Type: INDEX; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE INDEX email_error_address_idx ON email_errors USING btree (email_address);
+
+
+--
+-- Name: email_error_user_fkidx; Type: INDEX; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE INDEX email_error_user_fkidx ON email_errors USING btree (user_id);
+
+
+--
+-- Name: geoipblocks_geom_gix; Type: INDEX; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE INDEX geoipblocks_geom_gix ON geoipblocks USING gist (geom);
+
+
+--
+-- Name: geoipisp_company_ndx; Type: INDEX; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE INDEX geoipisp_company_ndx ON geoipisp USING btree (company);
+
+
+--
+-- Name: geoiplocations_geog_gix; Type: INDEX; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE INDEX geoiplocations_geog_gix ON geoiplocations USING gist (geog);
+
+
+--
+-- Name: index_active_admin_comments_on_author_type_and_author_id; Type: INDEX; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE INDEX index_active_admin_comments_on_author_type_and_author_id ON active_admin_comments USING btree (author_type, author_id);
+
+
+--
+-- Name: index_active_admin_comments_on_namespace; Type: INDEX; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE INDEX index_active_admin_comments_on_namespace ON active_admin_comments USING btree (namespace);
+
+
+--
+-- Name: index_admin_comments_on_resource_type_and_resource_id; Type: INDEX; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE INDEX index_admin_comments_on_resource_type_and_resource_id ON active_admin_comments USING btree (resource_type, resource_id);
+
+
+--
+-- Name: index_completed_at; Type: INDEX; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE INDEX index_completed_at ON mixes USING btree (completed_at);
+
+
+--
+-- Name: index_started_at; Type: INDEX; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE INDEX index_started_at ON mixes USING btree (started_at);
+
+
+--
+-- Name: jamcompany_company_ndx; Type: INDEX; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE UNIQUE INDEX jamcompany_company_ndx ON jamcompany USING btree (company);
+
+
+--
+-- Name: jamisp_coid_ndx; Type: INDEX; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE INDEX jamisp_coid_ndx ON jamisp USING btree (coid);
+
+
+--
+-- Name: jamisp_geom_gix; Type: INDEX; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE INDEX jamisp_geom_gix ON jamisp USING gist (geom);
+
+
+--
+-- Name: max_mind_isp_ip_bottom_idx; Type: INDEX; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE INDEX max_mind_isp_ip_bottom_idx ON max_mind_isp USING btree (ip_bottom);
+
+
+--
+-- Name: max_mind_isp_ip_top_idx; Type: INDEX; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE INDEX max_mind_isp_ip_top_idx ON max_mind_isp USING btree (ip_top);
+
+
+--
+-- Name: promo_latest_idx; Type: INDEX; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE INDEX promo_latest_idx ON promotionals USING btree (latest_id, latest_type);
+
+
+--
+-- Name: remember_token_idx; Type: INDEX; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE INDEX remember_token_idx ON users USING btree (remember_token);
+
+
+--
+-- Name: scores_alocidispid_blocidispid_score_dt_ndx; Type: INDEX; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE INDEX scores_alocidispid_blocidispid_score_dt_ndx ON scores USING btree (alocidispid, blocidispid, score_dt);
+
+
+--
+-- Name: scores_blocidispid_alocidispid_score_dt_ndx; Type: INDEX; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE INDEX scores_blocidispid_alocidispid_score_dt_ndx ON scores USING btree (blocidispid, alocidispid, score_dt);
+
+
+--
+-- Name: user_authorizations_user_id_idx; Type: INDEX; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE INDEX user_authorizations_user_id_idx ON user_authorizations USING btree (user_id);
+
+
+--
+-- Name: users_musician_email_idx; Type: INDEX; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE INDEX users_musician_email_idx ON users USING btree (subscribe_email, musician);
+
+
+--
+-- Name: users_name_tsv_index; Type: INDEX; Schema: public; Owner: -; Tablespace:
+--
+
+CREATE INDEX users_name_tsv_index ON users USING gin (name_tsv);
+
+
+--
+-- Name: tsvectorupdate; Type: TRIGGER; Schema: public; Owner: -
+--
+
+CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE ON users FOR EACH ROW EXECUTE PROCEDURE tsvector_update_trigger('name_tsv', 'public.jamenglish', 'first_name', 'last_name');
+
+
+--
+-- Name: tsvectorupdate; Type: TRIGGER; Schema: public; Owner: -
+--
+
+CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE ON bands FOR EACH ROW EXECUTE PROCEDURE tsvector_update_trigger('name_tsv', 'public.jamenglish', 'name');
+
+
+--
+-- Name: tsvectorupdate_description; Type: TRIGGER; Schema: public; Owner: -
+--
+
+CREATE TRIGGER tsvectorupdate_description BEFORE INSERT OR UPDATE ON claimed_recordings FOR EACH ROW EXECUTE PROCEDURE tsvector_update_trigger('description_tsv', 'public.jamenglish', 'description');
+
+
+--
+-- Name: tsvectorupdate_name; Type: TRIGGER; Schema: public; Owner: -
+--
+
+CREATE TRIGGER tsvectorupdate_name BEFORE INSERT OR UPDATE ON claimed_recordings FOR EACH ROW EXECUTE PROCEDURE tsvector_update_trigger('name_tsv', 'public.jamenglish', 'name');
+
+
+SET search_path = pgmigrate, pg_catalog;
+
+--
+-- Name: pg_migrations_pg_migrate_id_fkey; Type: FK CONSTRAINT; Schema: pgmigrate; Owner: -
+--
+
+ALTER TABLE ONLY pg_migrations
+ ADD CONSTRAINT pg_migrations_pg_migrate_id_fkey FOREIGN KEY (pg_migrate_id) REFERENCES pg_migrate(id);
+
+
+SET search_path = public, pg_catalog;
+
+--
+-- Name: band_invitations_band_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY band_invitations
+ ADD CONSTRAINT band_invitations_band_id_fkey FOREIGN KEY (band_id) REFERENCES bands(id) ON DELETE CASCADE;
+
+
+--
+-- Name: band_invitations_creator_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY band_invitations
+ ADD CONSTRAINT band_invitations_creator_id_fkey FOREIGN KEY (creator_id) REFERENCES users(id) ON DELETE CASCADE;
+
+
+--
+-- Name: band_invitations_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY band_invitations
+ ADD CONSTRAINT band_invitations_user_id_fkey FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
+
+--
+-- Name: bands_genres_band_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY bands_genres
+ ADD CONSTRAINT bands_genres_band_id_fkey FOREIGN KEY (band_id) REFERENCES bands(id) ON DELETE CASCADE;
+
+
+--
+-- Name: bands_genres_genre_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY bands_genres
+ ADD CONSTRAINT bands_genres_genre_id_fkey FOREIGN KEY (genre_id) REFERENCES genres(id) ON DELETE CASCADE;
+
+
+--
+-- Name: bands_musicians_band_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY bands_musicians
+ ADD CONSTRAINT bands_musicians_band_id_fkey FOREIGN KEY (band_id) REFERENCES bands(id) ON DELETE CASCADE;
+
+
+--
+-- Name: bands_musicians_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY bands_musicians
+ ADD CONSTRAINT bands_musicians_user_id_fkey FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
+
+--
+-- Name: chat_messages_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY chat_messages
+ ADD CONSTRAINT chat_messages_user_id_fkey FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
+
+--
+-- Name: claimed_recordings_genre_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY claimed_recordings
+ ADD CONSTRAINT claimed_recordings_genre_id_fkey FOREIGN KEY (genre_id) REFERENCES genres(id);
+
+
+--
+-- Name: connections_music_session_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY connections
+ ADD CONSTRAINT connections_music_session_id_fkey FOREIGN KEY (music_session_id) REFERENCES active_music_sessions(id) ON DELETE SET NULL;
+
+
+--
+-- Name: connections_tracks_connection_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY tracks
+ ADD CONSTRAINT connections_tracks_connection_id_fkey FOREIGN KEY (connection_id) REFERENCES connections(id) ON DELETE CASCADE;
+
+
+--
+-- Name: crash_dumps_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY crash_dumps
+ ADD CONSTRAINT crash_dumps_user_id_fkey FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL;
+
+
+--
+-- Name: diagnostics_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY diagnostics
+ ADD CONSTRAINT diagnostics_user_id_fkey FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
+
+--
+-- Name: email_batch_sets_email_batch_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY email_batch_sets
+ ADD CONSTRAINT email_batch_sets_email_batch_id_fkey FOREIGN KEY (email_batch_id) REFERENCES email_batches(id) ON DELETE CASCADE;
+
+
+--
+-- Name: email_errors_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY email_errors
+ ADD CONSTRAINT email_errors_user_id_fkey FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
+
+--
+-- Name: event_sessions_band_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY event_sessions
+ ADD CONSTRAINT event_sessions_band_id_fkey FOREIGN KEY (band_id) REFERENCES bands(id) ON DELETE SET NULL;
+
+
+--
+-- Name: event_sessions_event_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY event_sessions
+ ADD CONSTRAINT event_sessions_event_id_fkey FOREIGN KEY (event_id) REFERENCES events(id) ON DELETE CASCADE;
+
+
+--
+-- Name: event_sessions_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY event_sessions
+ ADD CONSTRAINT event_sessions_user_id_fkey FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL;
+
+
+--
+-- Name: fan_invitations_music_session_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY fan_invitations
+ ADD CONSTRAINT fan_invitations_music_session_id_fkey FOREIGN KEY (music_session_id) REFERENCES music_sessions(id) ON DELETE CASCADE;
+
+
+--
+-- Name: feeds_music_session_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY feeds
+ ADD CONSTRAINT feeds_music_session_id_fkey FOREIGN KEY (music_session_id) REFERENCES music_sessions(id) ON DELETE CASCADE;
+
+
+--
+-- Name: feeds_recording_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY feeds
+ ADD CONSTRAINT feeds_recording_id_fkey FOREIGN KEY (recording_id) REFERENCES recordings(id) ON DELETE CASCADE;
+
+
+--
+-- Name: follows_user_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY follows
+ ADD CONSTRAINT follows_user_fkey FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
+
+--
+-- Name: friend_requests_friend_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY friend_requests
+ ADD CONSTRAINT friend_requests_friend_id_fkey FOREIGN KEY (friend_id) REFERENCES users(id) ON DELETE CASCADE;
+
+
+--
+-- Name: friend_requests_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY friend_requests
+ ADD CONSTRAINT friend_requests_user_id_fkey FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
+
+--
+-- Name: friendships_friend_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY friendships
+ ADD CONSTRAINT friendships_friend_id_fkey FOREIGN KEY (friend_id) REFERENCES users(id) ON DELETE CASCADE;
+
+
+--
+-- Name: friendships_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY friendships
+ ADD CONSTRAINT friendships_user_id_fkey FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
+
+--
+-- Name: genres_music_sessions_music_session_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY genres_music_sessions
+ ADD CONSTRAINT genres_music_sessions_music_session_id_fkey FOREIGN KEY (music_session_id) REFERENCES active_music_sessions(id) ON DELETE CASCADE;
+
+
+--
+-- Name: icecast_mounts_icecast_mount_template_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY icecast_mounts
+ ADD CONSTRAINT icecast_mounts_icecast_mount_template_id_fkey FOREIGN KEY (icecast_mount_template_id) REFERENCES icecast_mount_templates(id) ON DELETE SET NULL;
+
+
+--
+-- Name: icecast_mounts_icecast_server_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY icecast_mounts
+ ADD CONSTRAINT icecast_mounts_icecast_server_id_fkey FOREIGN KEY (icecast_server_id) REFERENCES icecast_servers(id) ON DELETE SET NULL;
+
+
+--
+-- Name: icecast_mounts_music_session_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY icecast_mounts
+ ADD CONSTRAINT icecast_mounts_music_session_id_fkey FOREIGN KEY (music_session_id) REFERENCES active_music_sessions(id) ON DELETE CASCADE;
+
+
+--
+-- Name: icecast_server_mounts_icecast_server_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY icecast_server_mounts
+ ADD CONSTRAINT icecast_server_mounts_icecast_server_id_fkey FOREIGN KEY (icecast_server_id) REFERENCES icecast_servers(id) ON DELETE CASCADE;
+
+
+--
+-- Name: icecast_server_relays_icecast_relay_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY icecast_server_relays
+ ADD CONSTRAINT icecast_server_relays_icecast_relay_id_fkey FOREIGN KEY (icecast_relay_id) REFERENCES icecast_relays(id) ON DELETE CASCADE;
+
+
+--
+-- Name: icecast_server_relays_icecast_server_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY icecast_server_relays
+ ADD CONSTRAINT icecast_server_relays_icecast_server_id_fkey FOREIGN KEY (icecast_server_id) REFERENCES icecast_servers(id) ON DELETE CASCADE;
+
+
+--
+-- Name: icecast_server_sockets_icecast_listen_socket_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY icecast_server_sockets
+ ADD CONSTRAINT icecast_server_sockets_icecast_listen_socket_id_fkey FOREIGN KEY (icecast_listen_socket_id) REFERENCES icecast_listen_sockets(id) ON DELETE CASCADE;
+
+
+--
+-- Name: icecast_server_sockets_icecast_server_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY icecast_server_sockets
+ ADD CONSTRAINT icecast_server_sockets_icecast_server_id_fkey FOREIGN KEY (icecast_server_id) REFERENCES icecast_servers(id) ON DELETE CASCADE;
+
+
+--
+-- Name: icecast_servers_admin_auth_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY icecast_servers
+ ADD CONSTRAINT icecast_servers_admin_auth_id_fkey FOREIGN KEY (admin_auth_id) REFERENCES icecast_admin_authentications(id) ON DELETE SET NULL;
+
+
+--
+-- Name: icecast_servers_directory_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY icecast_servers
+ ADD CONSTRAINT icecast_servers_directory_id_fkey FOREIGN KEY (directory_id) REFERENCES icecast_directories(id) ON DELETE SET NULL;
+
+
+--
+-- Name: icecast_servers_icecast_server_group_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY icecast_servers
+ ADD CONSTRAINT icecast_servers_icecast_server_group_id_fkey FOREIGN KEY (icecast_server_group_id) REFERENCES icecast_server_groups(id) ON DELETE SET NULL;
+
+
+--
+-- Name: icecast_servers_limit_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY icecast_servers
+ ADD CONSTRAINT icecast_servers_limit_id_fkey FOREIGN KEY (limit_id) REFERENCES icecast_limits(id) ON DELETE SET NULL;
+
+
+--
+-- Name: icecast_servers_logging_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY icecast_servers
+ ADD CONSTRAINT icecast_servers_logging_id_fkey FOREIGN KEY (logging_id) REFERENCES icecast_loggings(id) ON DELETE SET NULL;
+
+
+--
+-- Name: icecast_servers_master_relay_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY icecast_servers
+ ADD CONSTRAINT icecast_servers_master_relay_id_fkey FOREIGN KEY (master_relay_id) REFERENCES icecast_master_server_relays(id) ON DELETE SET NULL;
+
+
+--
+-- Name: icecast_servers_mount_template_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY icecast_servers
+ ADD CONSTRAINT icecast_servers_mount_template_id_fkey FOREIGN KEY (mount_template_id) REFERENCES icecast_mount_templates(id) ON DELETE SET NULL;
+
+
+--
+-- Name: icecast_servers_path_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY icecast_servers
+ ADD CONSTRAINT icecast_servers_path_id_fkey FOREIGN KEY (path_id) REFERENCES icecast_paths(id) ON DELETE SET NULL;
+
+
+--
+-- Name: icecast_servers_security_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY icecast_servers
+ ADD CONSTRAINT icecast_servers_security_id_fkey FOREIGN KEY (security_id) REFERENCES icecast_securities(id) ON DELETE SET NULL;
+
+
+--
+-- Name: icecast_servers_template_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY icecast_servers
+ ADD CONSTRAINT icecast_servers_template_id_fkey FOREIGN KEY (template_id) REFERENCES icecast_templates(id) ON DELETE SET NULL;
+
+
+--
+-- Name: icecast_template_sockets_icecast_listen_socket_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY icecast_template_sockets
+ ADD CONSTRAINT icecast_template_sockets_icecast_listen_socket_id_fkey FOREIGN KEY (icecast_listen_socket_id) REFERENCES icecast_listen_sockets(id) ON DELETE CASCADE;
+
+
+--
+-- Name: icecast_template_sockets_icecast_template_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY icecast_template_sockets
+ ADD CONSTRAINT icecast_template_sockets_icecast_template_id_fkey FOREIGN KEY (icecast_template_id) REFERENCES icecast_templates(id) ON DELETE CASCADE;
+
+
+--
+-- Name: icecast_templates_admin_auth_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY icecast_templates
+ ADD CONSTRAINT icecast_templates_admin_auth_id_fkey FOREIGN KEY (admin_auth_id) REFERENCES icecast_admin_authentications(id) ON DELETE SET NULL;
+
+
+--
+-- Name: icecast_templates_directory_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY icecast_templates
+ ADD CONSTRAINT icecast_templates_directory_id_fkey FOREIGN KEY (directory_id) REFERENCES icecast_directories(id) ON DELETE SET NULL;
+
+
+--
+-- Name: icecast_templates_limit_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY icecast_templates
+ ADD CONSTRAINT icecast_templates_limit_id_fkey FOREIGN KEY (limit_id) REFERENCES icecast_limits(id) ON DELETE SET NULL;
+
+
+--
+-- Name: icecast_templates_logging_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY icecast_templates
+ ADD CONSTRAINT icecast_templates_logging_id_fkey FOREIGN KEY (logging_id) REFERENCES icecast_loggings(id) ON DELETE SET NULL;
+
+
+--
+-- Name: icecast_templates_master_relay_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY icecast_templates
+ ADD CONSTRAINT icecast_templates_master_relay_id_fkey FOREIGN KEY (master_relay_id) REFERENCES icecast_master_server_relays(id) ON DELETE SET NULL;
+
+
+--
+-- Name: icecast_templates_path_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY icecast_templates
+ ADD CONSTRAINT icecast_templates_path_id_fkey FOREIGN KEY (path_id) REFERENCES icecast_paths(id) ON DELETE SET NULL;
+
+
+--
+-- Name: icecast_templates_security_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY icecast_templates
+ ADD CONSTRAINT icecast_templates_security_id_fkey FOREIGN KEY (security_id) REFERENCES icecast_securities(id) ON DELETE SET NULL;
+
+
+--
+-- Name: invitations_join_request_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY invitations
+ ADD CONSTRAINT invitations_join_request_id_fkey FOREIGN KEY (join_request_id) REFERENCES join_requests(id) ON DELETE CASCADE;
+
+
+--
+-- Name: invitations_music_session_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY invitations
+ ADD CONSTRAINT invitations_music_session_id_fkey FOREIGN KEY (music_session_id) REFERENCES music_sessions(id) ON DELETE CASCADE;
+
+
+--
+-- Name: invited_users_sender_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY invited_users
+ ADD CONSTRAINT invited_users_sender_id_fkey FOREIGN KEY (sender_id) REFERENCES users(id) ON DELETE CASCADE;
+
+
+--
+-- Name: join_requests_music_session_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY join_requests
+ ADD CONSTRAINT join_requests_music_session_id_fkey FOREIGN KEY (music_session_id) REFERENCES music_sessions(id) ON DELETE CASCADE;
+
+
+--
+-- Name: likes_user_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY likes
+ ADD CONSTRAINT likes_user_fkey FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
+
+--
+-- Name: mixes_recording_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY mixes
+ ADD CONSTRAINT mixes_recording_id_fkey FOREIGN KEY (recording_id) REFERENCES recordings(id) ON DELETE CASCADE;
+
+
+--
+-- Name: music_sessions_comments_creator_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY music_sessions_comments
+ ADD CONSTRAINT music_sessions_comments_creator_id_fkey FOREIGN KEY (creator_id) REFERENCES users(id) ON DELETE CASCADE;
+
+
+--
+-- Name: music_sessions_comments_music_session_id2_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY music_sessions_comments
+ ADD CONSTRAINT music_sessions_comments_music_session_id2_fkey FOREIGN KEY (music_session_id) REFERENCES music_sessions(id) ON DELETE CASCADE;
+
+
+--
+-- Name: music_sessions_history_band_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY music_sessions
+ ADD CONSTRAINT music_sessions_history_band_id_fkey FOREIGN KEY (band_id) REFERENCES bands(id) ON DELETE CASCADE;
+
+
+--
+-- Name: music_sessions_history_genre_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY music_sessions
+ ADD CONSTRAINT music_sessions_history_genre_id_fkey FOREIGN KEY (genre_id) REFERENCES genres(id);
+
+
+--
+-- Name: music_sessions_history_recurring_session_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY music_sessions
+ ADD CONSTRAINT music_sessions_history_recurring_session_id_fkey FOREIGN KEY (recurring_session_id) REFERENCES recurring_sessions(id);
+
+
+--
+-- Name: music_sessions_history_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY music_sessions
+ ADD CONSTRAINT music_sessions_history_user_id_fkey FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
+
+--
+-- Name: music_sessions_likers_liker_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY music_sessions_likers
+ ADD CONSTRAINT music_sessions_likers_liker_id_fkey FOREIGN KEY (liker_id) REFERENCES users(id) ON DELETE CASCADE;
+
+
+--
+-- Name: music_sessions_likers_music_session_id2_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY music_sessions_likers
+ ADD CONSTRAINT music_sessions_likers_music_session_id2_fkey FOREIGN KEY (music_session_id) REFERENCES music_sessions(id) ON DELETE CASCADE;
+
+
+--
+-- Name: music_sessions_user_history_music_session_id2_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY music_sessions_user_history
+ ADD CONSTRAINT music_sessions_user_history_music_session_id2_fkey FOREIGN KEY (music_session_id) REFERENCES music_sessions(id) ON DELETE CASCADE;
+
+
+--
+-- Name: music_sessions_user_history_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY music_sessions_user_history
+ ADD CONSTRAINT music_sessions_user_history_user_id_fkey FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
+
+--
+-- Name: musicians_instruments_instrument_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY musicians_instruments
+ ADD CONSTRAINT musicians_instruments_instrument_id_fkey FOREIGN KEY (instrument_id) REFERENCES instruments(id) ON DELETE CASCADE;
+
+
+--
+-- Name: musicians_instruments_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY musicians_instruments
+ ADD CONSTRAINT musicians_instruments_user_id_fkey FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
+
+--
+-- Name: musicians_recordings_recording_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY claimed_recordings
+ ADD CONSTRAINT musicians_recordings_recording_id_fkey FOREIGN KEY (recording_id) REFERENCES recordings(id) ON DELETE CASCADE;
+
+
+--
+-- Name: musicians_recordings_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY claimed_recordings
+ ADD CONSTRAINT musicians_recordings_user_id_fkey FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
+
+--
+-- Name: notifications_band_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY notifications
+ ADD CONSTRAINT notifications_band_id_fkey FOREIGN KEY (band_id) REFERENCES bands(id) ON DELETE CASCADE;
+
+
+--
+-- Name: notifications_band_invitation_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY notifications
+ ADD CONSTRAINT notifications_band_invitation_id_fkey FOREIGN KEY (band_invitation_id) REFERENCES band_invitations(id) ON DELETE CASCADE;
+
+
+--
+-- Name: notifications_friend_request_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY notifications
+ ADD CONSTRAINT notifications_friend_request_id_fkey FOREIGN KEY (friend_request_id) REFERENCES friend_requests(id);
+
+
+--
+-- Name: notifications_recording_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY notifications
+ ADD CONSTRAINT notifications_recording_id_fkey FOREIGN KEY (recording_id) REFERENCES recordings(id) ON DELETE CASCADE;
+
+
+--
+-- Name: notifications_source_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY notifications
+ ADD CONSTRAINT notifications_source_user_id_fkey FOREIGN KEY (source_user_id) REFERENCES users(id) ON DELETE CASCADE;
+
+
+--
+-- Name: notifications_target_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY notifications
+ ADD CONSTRAINT notifications_target_user_id_fkey FOREIGN KEY (target_user_id) REFERENCES users(id) ON DELETE CASCADE;
+
+
+--
+-- Name: playable_plays_claimed_recording_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY playable_plays
+ ADD CONSTRAINT playable_plays_claimed_recording_id_fkey FOREIGN KEY (claimed_recording_id) REFERENCES claimed_recordings(id) ON DELETE CASCADE;
+
+
+--
+-- Name: playable_plays_player_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY playable_plays
+ ADD CONSTRAINT playable_plays_player_id_fkey FOREIGN KEY (player_id) REFERENCES users(id) ON DELETE CASCADE;
+
+
+--
+-- Name: recorded_tracks_recording_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY recorded_tracks
+ ADD CONSTRAINT recorded_tracks_recording_id_fkey FOREIGN KEY (recording_id) REFERENCES recordings(id) ON DELETE CASCADE;
+
+
+--
+-- Name: recordings_band_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY recordings
+ ADD CONSTRAINT recordings_band_id_fkey FOREIGN KEY (band_id) REFERENCES bands(id);
+
+
+--
+-- Name: recordings_comments_creator_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY recordings_comments
+ ADD CONSTRAINT recordings_comments_creator_id_fkey FOREIGN KEY (creator_id) REFERENCES users(id) ON DELETE CASCADE;
+
+
+--
+-- Name: recordings_comments_recording_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY recordings_comments
+ ADD CONSTRAINT recordings_comments_recording_id_fkey FOREIGN KEY (recording_id) REFERENCES recordings(id) ON DELETE CASCADE;
+
+
+--
+-- Name: recordings_creator_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY recordings
+ ADD CONSTRAINT recordings_creator_id_fkey FOREIGN KEY (owner_id) REFERENCES users(id) ON DELETE CASCADE;
+
+
+--
+-- Name: recordings_downloads_downloader_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY recordings_downloads
+ ADD CONSTRAINT recordings_downloads_downloader_id_fkey FOREIGN KEY (downloader_id) REFERENCES users(id) ON DELETE CASCADE;
+
+
+--
+-- Name: recordings_downloads_recording_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY recordings_downloads
+ ADD CONSTRAINT recordings_downloads_recording_id_fkey FOREIGN KEY (recording_id) REFERENCES recordings(id) ON DELETE CASCADE;
+
+
+--
+-- Name: recordings_likers_claimed_recording_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY recordings_likers
+ ADD CONSTRAINT recordings_likers_claimed_recording_id_fkey FOREIGN KEY (claimed_recording_id) REFERENCES claimed_recordings(id);
+
+
+--
+-- Name: recordings_likers_liker_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY recordings_likers
+ ADD CONSTRAINT recordings_likers_liker_id_fkey FOREIGN KEY (liker_id) REFERENCES users(id) ON DELETE CASCADE;
+
+
+--
+-- Name: recordings_likers_recording_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY recordings_likers
+ ADD CONSTRAINT recordings_likers_recording_id_fkey FOREIGN KEY (recording_id) REFERENCES recordings(id) ON DELETE CASCADE;
+
+
+--
+-- Name: recurring_sessions_band_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY recurring_sessions
+ ADD CONSTRAINT recurring_sessions_band_id_fkey FOREIGN KEY (band_id) REFERENCES bands(id) ON DELETE CASCADE;
+
+
+--
+-- Name: recurring_sessions_genre_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY recurring_sessions
+ ADD CONSTRAINT recurring_sessions_genre_id_fkey FOREIGN KEY (genre_id) REFERENCES genres(id);
+
+
+--
+-- Name: recurring_sessions_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY recurring_sessions
+ ADD CONSTRAINT recurring_sessions_user_id_fkey FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
+
+--
+-- Name: rsvp_requests_rsvp_slot_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY rsvp_requests
+ ADD CONSTRAINT rsvp_requests_rsvp_slot_id_fkey FOREIGN KEY (rsvp_slot_id) REFERENCES rsvp_slots(id) ON DELETE CASCADE;
+
+
+--
+-- Name: rsvp_requests_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY rsvp_requests
+ ADD CONSTRAINT rsvp_requests_user_id_fkey FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
+
+--
+-- Name: rsvp_slots_instrument_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY rsvp_slots
+ ADD CONSTRAINT rsvp_slots_instrument_id_fkey FOREIGN KEY (instrument_id) REFERENCES instruments(id);
+
+
+--
+-- Name: rsvp_slots_music_session_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY rsvp_slots
+ ADD CONSTRAINT rsvp_slots_music_session_id_fkey FOREIGN KEY (music_session_id) REFERENCES music_sessions(id) ON DELETE CASCADE;
+
+
+--
+-- Name: saved_tracks_instrument_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY recorded_tracks
+ ADD CONSTRAINT saved_tracks_instrument_id_fkey FOREIGN KEY (instrument_id) REFERENCES instruments(id) ON DELETE CASCADE;
+
+
+--
+-- Name: saved_tracks_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY recorded_tracks
+ ADD CONSTRAINT saved_tracks_user_id_fkey FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
+
+--
+-- Name: user_authorizations_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY user_authorizations
+ ADD CONSTRAINT user_authorizations_user_id_fkey FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
+
+
+--
+-- Name: users_affiliate_referral_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY users
+ ADD CONSTRAINT users_affiliate_referral_id_fkey FOREIGN KEY (affiliate_referral_id) REFERENCES affiliate_partners(id);
+
+
+--
+-- Name: users_icecast_server_group_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY users
+ ADD CONSTRAINT users_icecast_server_group_id_fkey FOREIGN KEY (icecast_server_group_id) REFERENCES icecast_server_groups(id);
+
+
+--
+-- PostgreSQL database dump complete
+--
+
+SET search_path TO "$user", public, topology;
+
diff --git a/web/lib/tasks/email.rake b/web/lib/tasks/email.rake
new file mode 100644
index 000000000..0d2a77977
--- /dev/null
+++ b/web/lib/tasks/email.rake
@@ -0,0 +1,13 @@
+namespace :emails do
+
+ task :test_progression_email => :environment do |task, args|
+ user = User.find_by_email('jonathan@jamkazam.com')
+ EmailBatchProgression::SUBTYPES.each do |stype|
+ ebatch = EmailBatchProgression.create
+ ebatch.update_attribute(:sub_type, stype)
+ ebatch.email_batch_sets << (bset = ebatch.make_set(user, 0))
+ ProgressMailer.send_reminder(bset).deliver
+ end
+ end
+
+end
diff --git a/web/lib/tasks/google.rake b/web/lib/tasks/google.rake
new file mode 100644
index 000000000..c3ef000eb
--- /dev/null
+++ b/web/lib/tasks/google.rake
@@ -0,0 +1,13 @@
+=begin
+require 'google/api_client'
+
+namespace :google do
+
+ task :youtube do |task, args|
+ client = Google::APIClient.new
+ yt = client.discovered_api('youtube', 'v3')
+ # google-api oauth-2-login --client-id='785931784279-gd0g8on6sc0tuesj7cu763pitaiv2la8.apps.googleusercontent.com' --client-secret='UwzIcvtErv9c2-GIsNfIo7bA' --scope="https://www.googleapis.com/auth/plus.me"
+ end
+
+end
+=end
\ No newline at end of file
diff --git a/web/lib/tasks/sample_data.rake b/web/lib/tasks/sample_data.rake
index 0da3673f7..58d25782b 100644
--- a/web/lib/tasks/sample_data.rake
+++ b/web/lib/tasks/sample_data.rake
@@ -88,6 +88,17 @@ namespace :db do
make_music_sessions_history
make_music_sessions_user_history
end
+
+ task affiliate_traffic_earnings: :environment do
+ partner = FactoryGirl.create(:affiliate_partner)
+ user_partner = FactoryGirl.create(:user, affiliate_partner: partner)
+
+ puts "USER CREATED: u: #{user_partner.email}/p: foobar"
+
+ today = Date.today
+ quarter1 = FactoryGirl.create(:affiliate_quarterly_payment, affiliate_partner: partner, due_amount_in_cents: 10000, closed:true)
+ month1 = FactoryGirl.create(:affiliate_monthly_payment, affiliate_partner: partner, due_amount_in_cents: 10000, closed:true)
+ end
end
def make_music_sessions_history
diff --git a/web/lib/user_manager.rb b/web/lib/user_manager.rb
index 0ce291b60..8f231a57b 100644
--- a/web/lib/user_manager.rb
+++ b/web/lib/user_manager.rb
@@ -28,6 +28,7 @@ class UserManager < BaseManager
affiliate_referral_id = options[:affiliate_referral_id]
any_user = options[:any_user]
signup_hint = options[:signup_hint]
+ affiliate_partner = options[:affiliate_partner]
recaptcha_failed = false
unless options[:skip_recaptcha] # allow callers to opt-of recaptcha
@@ -70,7 +71,8 @@ class UserManager < BaseManager
signup_confirm_url: signup_confirm_url,
affiliate_referral_id: affiliate_referral_id,
any_user: any_user,
- signup_hint: signup_hint)
+ signup_hint: signup_hint,
+ affiliate_partner: affiliate_partner)
user
end
diff --git a/web/loop.bash b/web/loop.bash
new file mode 100755
index 000000000..1c38b6d12
--- /dev/null
+++ b/web/loop.bash
@@ -0,0 +1,7 @@
+#!/bin/bash
+
+for i in {1..100}
+do
+ echo "Loop $i "`date`
+ bundle exec rspec spec/features/music_sessions_spec.rb
+done
\ No newline at end of file
diff --git a/web/public/maintenance.html b/web/public/maintenance.html
index d0641191d..2edb104cc 100644
--- a/web/public/maintenance.html
+++ b/web/public/maintenance.html
@@ -82,7 +82,7 @@
table { border-collapse: collapse; border-spacing: 0px; }
caption, th, td { text-align: left; font-weight: normal; vertical-align: middle; }
a img { border: medium none; }
- body { color: white; background-color: rgb(38, 38, 38); width: 100%; height: 100%; overflow: hidden; font-size: 14px; font-family: Raleway,Arial,Helvetica,sans-serif; font-weight: 300; }
+ body { color: white; background-color: rgb(38, 38, 38); width: 100%; height: 100%; overflow: hidden; font-size: 14px; font-family: 'Raleway',Arial,Helvetica,sans-serif; font-weight: 300; }
a { cursor: pointer; color: rgb(255, 204, 0); text-decoration: none; display: inline-block; }
a:hover { text-decoration: underline; color: rgb(130, 174, 175); }
select { padding: 3px; font-size: 15px; border-radius: 6px; }
diff --git a/web/ruby-bt.txt b/web/ruby-bt.txt
new file mode 100644
index 000000000..e5351db3a
--- /dev/null
+++ b/web/ruby-bt.txt
@@ -0,0 +1,919 @@
+$ bundle exec rake routes
+/home/jam/.rvm/gems/ruby-2.0.0-p247/gems/json-1.8.1/lib/json/common.rb:67: [BUG] Segmentation fault
+ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-linux]
+
+-- Control frame information -----------------------------------------------
+c:0056 p:---- s:0192 e:000191 CFUNC :initialize
+c:0055 p:---- s:0190 e:000189 CFUNC :new
+c:0054 p:0075 s:0187 e:000184 METHOD /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/json-1.8.1/lib/json/common.rb:67
+c:0053 p:0070 s:0176 e:000174 CLASS /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/json-1.8.1/lib/json/ext.rb:17
+c:0052 p:0011 s:0173 e:000172 CLASS /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/json-1.8.1/lib/json/ext.rb:12
+c:0051 p:0057 s:0171 e:000170 TOP /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/json-1.8.1/lib/json/ext.rb:9 [FINISH]
+c:0050 p:---- s:0169 e:000168 CFUNC :require
+c:0049 p:0010 s:0165 e:000164 BLOCK /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/dependencies.rb:251
+c:0048 p:0054 s:0163 e:000162 METHOD /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/dependencies.rb:236
+c:0047 p:0015 s:0158 e:000157 METHOD /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/dependencies.rb:251
+c:0046 p:0019 s:0153 e:000152 CLASS /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/json-1.8.1/lib/json.rb:58
+c:0045 p:0017 s:0151 e:000150 TOP /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/json-1.8.1/lib/json.rb:54 [FINISH]
+c:0044 p:---- s:0149 e:000148 CFUNC :require
+c:0043 p:0010 s:0145 e:000144 BLOCK /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/dependencies.rb:251
+c:0042 p:0054 s:0143 e:000142 METHOD /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/dependencies.rb:236
+c:0041 p:0015 s:0138 e:000137 METHOD /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/dependencies.rb:251
+c:0040 p:0009 s:0133 e:000132 TOP /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/object/to_json.rb:3 [FINISH]
+c:0039 p:---- s:0131 e:000130 CFUNC :require
+c:0038 p:0010 s:0127 e:000126 BLOCK /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/dependencies.rb:251
+c:0037 p:0054 s:0125 e:000124 METHOD /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/dependencies.rb:236
+c:0036 p:0015 s:0120 e:000119 METHOD /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/dependencies.rb:251
+c:0035 p:0007 s:0115 e:000114 TOP /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/json/encoding.rb:1 [FINISH]
+c:0034 p:---- s:0113 e:000112 CFUNC :require
+c:0033 p:0010 s:0109 e:000108 BLOCK /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/dependencies.rb:251
+c:0032 p:0054 s:0107 e:000106 METHOD /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/dependencies.rb:236
+c:0031 p:0015 s:0102 e:000101 METHOD /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/dependencies.rb:251
+c:0030 p:0015 s:0097 e:000096 TOP /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/json.rb:2 [FINISH]
+c:0029 p:---- s:0095 e:000094 CFUNC :require
+c:0028 p:0010 s:0091 e:000090 BLOCK /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/dependencies.rb:251
+c:0027 p:0054 s:0089 e:000088 METHOD /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/dependencies.rb:236
+c:0026 p:0015 s:0084 e:000083 METHOD /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/dependencies.rb:251
+c:0025 p:0007 s:0079 e:000078 TOP /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activemodel-3.2.15/lib/active_model/serializers/json.rb:1 [FINISH]
+c:0024 p:0029 s:0077 e:000075 CLASS /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/serialization.rb:5
+c:0023 p:0011 s:0074 e:000073 CLASS /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/serialization.rb:3
+c:0022 p:0009 s:0072 e:000071 TOP /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/serialization.rb:1 [FINISH]
+c:0021 p:0770 s:0070 e:000065 CLASS /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/base.rb:715
+c:0020 p:0011 s:0064 e:000063 CLASS /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/base.rb:333
+c:0019 p:0228 s:0062 e:000061 TOP /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/base.rb:33 [FINISH]
+c:0018 p:0068 s:0060 e:000059 TOP /home/jam/workspace/jam-cloud/web/config/application.rb:13 [FINISH]
+c:0017 p:---- s:0058 e:000057 CFUNC :require
+c:0016 p:0018 s:0054 e:000053 TOP /home/jam/workspace/jam-cloud/web/Rakefile:5 [FINISH]
+c:0015 p:---- s:0052 e:000051 CFUNC :load
+c:0014 p:0009 s:0048 e:000047 METHOD /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/rake_module.rb:25
+c:0013 p:0176 s:0044 e:000043 METHOD /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/application.rb:637
+c:0012 p:0007 s:0039 e:000038 BLOCK /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/application.rb:94
+c:0011 p:0006 s:0037 e:000036 METHOD /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/application.rb:165
+c:0010 p:0007 s:0033 e:000032 METHOD /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/application.rb:93
+c:0009 p:0013 s:0030 e:000029 BLOCK /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/application.rb:77
+c:0008 p:0006 s:0028 e:000027 METHOD /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/application.rb:165
+c:0007 p:0007 s:0024 e:000023 METHOD /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/application.rb:75
+c:0006 p:0040 s:0021 e:000020 TOP /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/bin/rake:33 [FINISH]
+c:0005 p:---- s:0019 e:000018 CFUNC :load
+c:0004 p:0118 s:0015 E:000da8 EVAL /home/jam/.rvm/gems/ruby-2.0.0-p247@global/bin/rake:23 [FINISH]
+c:0003 p:---- s:0011 e:000010 CFUNC :eval
+c:0002 p:0118 s:0005 E:001d40 EVAL /home/jam/.rvm/gems/ruby-2.0.0-p247@global/bin/ruby_executable_hooks:15 [FINISH]
+c:0001 p:0000 s:0002 E:000338 TOP [FINISH]
+
+/home/jam/.rvm/gems/ruby-2.0.0-p247@global/bin/ruby_executable_hooks:15:in `'
+/home/jam/.rvm/gems/ruby-2.0.0-p247@global/bin/ruby_executable_hooks:15:in `eval'
+/home/jam/.rvm/gems/ruby-2.0.0-p247@global/bin/rake:23:in `'
+/home/jam/.rvm/gems/ruby-2.0.0-p247@global/bin/rake:23:in `load'
+/home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/bin/rake:33:in `'
+/home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/application.rb:75:in `run'
+/home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/application.rb:165:in `standard_exception_handling'
+/home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/application.rb:77:in `block in run'
+/home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/application.rb:93:in `load_rakefile'
+/home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/application.rb:165:in `standard_exception_handling'
+/home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/application.rb:94:in `block in load_rakefile'
+/home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/application.rb:637:in `raw_load_rakefile'
+/home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/rake_module.rb:25:in `load_rakefile'
+/home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/rake_module.rb:25:in `load'
+/home/jam/workspace/jam-cloud/web/Rakefile:5:in `'
+/home/jam/workspace/jam-cloud/web/Rakefile:5:in `require'
+/home/jam/workspace/jam-cloud/web/config/application.rb:13:in `'
+/home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/base.rb:33:in `'
+/home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/base.rb:333:in `'
+/home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/base.rb:715:in `'
+/home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/serialization.rb:1:in `'
+/home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/serialization.rb:3:in `'
+/home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/serialization.rb:5:in `'
+/home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activemodel-3.2.15/lib/active_model/serializers/json.rb:1:in `'
+/home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/dependencies.rb:251:in `require'
+/home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/dependencies.rb:236:in `load_dependency'
+/home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/dependencies.rb:251:in `block in require'
+/home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/dependencies.rb:251:in `require'
+/home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/json.rb:2:in `'
+/home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/dependencies.rb:251:in `require'
+/home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/dependencies.rb:236:in `load_dependency'
+/home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/dependencies.rb:251:in `block in require'
+/home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/dependencies.rb:251:in `require'
+/home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/json/encoding.rb:1:in `'
+/home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/dependencies.rb:251:in `require'
+/home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/dependencies.rb:236:in `load_dependency'
+/home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/dependencies.rb:251:in `block in require'
+/home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/dependencies.rb:251:in `require'
+/home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/object/to_json.rb:3:in `'
+/home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/dependencies.rb:251:in `require'
+/home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/dependencies.rb:236:in `load_dependency'
+/home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/dependencies.rb:251:in `block in require'
+/home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/dependencies.rb:251:in `require'
+/home/jam/.rvm/gems/ruby-2.0.0-p247/gems/json-1.8.1/lib/json.rb:54:in `'
+/home/jam/.rvm/gems/ruby-2.0.0-p247/gems/json-1.8.1/lib/json.rb:58:in `'
+/home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/dependencies.rb:251:in `require'
+/home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/dependencies.rb:236:in `load_dependency'
+/home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/dependencies.rb:251:in `block in require'
+/home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/dependencies.rb:251:in `require'
+/home/jam/.rvm/gems/ruby-2.0.0-p247/gems/json-1.8.1/lib/json/ext.rb:9:in `'
+/home/jam/.rvm/gems/ruby-2.0.0-p247/gems/json-1.8.1/lib/json/ext.rb:12:in `'
+/home/jam/.rvm/gems/ruby-2.0.0-p247/gems/json-1.8.1/lib/json/ext.rb:17:in `'
+/home/jam/.rvm/gems/ruby-2.0.0-p247/gems/json-1.8.1/lib/json/common.rb:67:in `generator='
+/home/jam/.rvm/gems/ruby-2.0.0-p247/gems/json-1.8.1/lib/json/common.rb:67:in `new'
+/home/jam/.rvm/gems/ruby-2.0.0-p247/gems/json-1.8.1/lib/json/common.rb:67:in `initialize'
+
+-- C level backtrace information -------------------------------------------
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x19d7f5) [0x7fd2a8a937f5] vm_dump.c:647
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x64dbc) [0x7fd2a895adbc] error.c:283
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(rb_bug+0xb7) [0x7fd2a895c2c7] error.c:302
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x129cee) [0x7fd2a8a1fcee] signal.c:672
+/lib/x86_64-linux-gnu/libc.so.6(+0x364a0) [0x7fd2a856d4a0]
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(rb_hash_aref+0x11) [0x7fd2a897ce31] hash.c:561
+/home/jam/.rvm/gems/ruby-2.0.0-p247/gems/json-1.8.1/lib/json/ext/generator.so(+0x3294) [0x7fd2a3f99294] generator.c:528
+/home/jam/.rvm/gems/ruby-2.0.0-p247/gems/json-1.8.1/lib/json/ext/generator.so(+0x4d9f) [0x7fd2a3f9ad9f] generator.c:954
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x193440) [0x7fd2a8a89440] vm_eval.c:117
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x1939e3) [0x7fd2a8a899e3] vm_eval.c:49
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(rb_class_new_instance+0x30) [0x7fd2a89b5ae0] object.c:1761
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x187c06) [0x7fd2a8a7dc06] vm_insnhelper.c:1469
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x1965ff) [0x7fd2a8a8c5ff] vm_insnhelper.c:1559
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x18c2d2) [0x7fd2a8a822d2] insns.def:1017
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x192036) [0x7fd2a8a88036] vm.c:1201
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(rb_iseq_eval+0x176) [0x7fd2a8a8e8f6] vm.c:1436
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x6f784) [0x7fd2a8965784] load.c:599
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(rb_require_safe+0x4ff) [0x7fd2a896757f] load.c:959
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x187c06) [0x7fd2a8a7dc06] vm_insnhelper.c:1469
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x1965ff) [0x7fd2a8a8c5ff] vm_insnhelper.c:1559
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x18c45d) [0x7fd2a8a8245d] insns.def:1039
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x192036) [0x7fd2a8a88036] vm.c:1201
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(rb_iseq_eval+0x176) [0x7fd2a8a8e8f6] vm.c:1436
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x6f784) [0x7fd2a8965784] load.c:599
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(rb_require_safe+0x4ff) [0x7fd2a896757f] load.c:959
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x187c06) [0x7fd2a8a7dc06] vm_insnhelper.c:1469
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x1965ff) [0x7fd2a8a8c5ff] vm_insnhelper.c:1559
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x18c45d) [0x7fd2a8a8245d] insns.def:1039
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x192036) [0x7fd2a8a88036] vm.c:1201
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(rb_iseq_eval+0x176) [0x7fd2a8a8e8f6] vm.c:1436
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x6f784) [0x7fd2a8965784] load.c:599
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(rb_require_safe+0x4ff) [0x7fd2a896757f] load.c:959
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x187c06) [0x7fd2a8a7dc06] vm_insnhelper.c:1469
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x1965ff) [0x7fd2a8a8c5ff] vm_insnhelper.c:1559
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x18c45d) [0x7fd2a8a8245d] insns.def:1039
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x192036) [0x7fd2a8a88036] vm.c:1201
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(rb_iseq_eval+0x176) [0x7fd2a8a8e8f6] vm.c:1436
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x6f784) [0x7fd2a8965784] load.c:599
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(rb_require_safe+0x4ff) [0x7fd2a896757f] load.c:959
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x187c06) [0x7fd2a8a7dc06] vm_insnhelper.c:1469
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x1965ff) [0x7fd2a8a8c5ff] vm_insnhelper.c:1559
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x18c45d) [0x7fd2a8a8245d] insns.def:1039
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x192036) [0x7fd2a8a88036] vm.c:1201
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(rb_iseq_eval+0x176) [0x7fd2a8a8e8f6] vm.c:1436
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x6f784) [0x7fd2a8965784] load.c:599
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(rb_require_safe+0x4ff) [0x7fd2a896757f] load.c:959
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x187c06) [0x7fd2a8a7dc06] vm_insnhelper.c:1469
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x1965ff) [0x7fd2a8a8c5ff] vm_insnhelper.c:1559
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x18c45d) [0x7fd2a8a8245d] insns.def:1039
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x192036) [0x7fd2a8a88036] vm.c:1201
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(rb_iseq_eval+0x176) [0x7fd2a8a8e8f6] vm.c:1436
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x6f784) [0x7fd2a8965784] load.c:599
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(rb_require_safe+0x4ff) [0x7fd2a896757f] load.c:959
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(rb_protect+0xd7) [0x7fd2a8963307] eval.c:786
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(rb_autoload_load+0x10c) [0x7fd2a8a614fc] variable.c:1781
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x16b687) [0x7fd2a8a61687] variable.c:1841
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x189e48) [0x7fd2a8a7fe48] vm_insnhelper.c:450
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x192036) [0x7fd2a8a88036] vm.c:1201
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(rb_iseq_eval+0x176) [0x7fd2a8a8e8f6] vm.c:1436
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x6f784) [0x7fd2a8965784] load.c:599
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(rb_require_safe+0x4ff) [0x7fd2a896757f] load.c:959
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(rb_protect+0xd7) [0x7fd2a8963307] eval.c:786
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(rb_autoload_load+0x10c) [0x7fd2a8a614fc] variable.c:1781
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x18784f) [0x7fd2a8a7d84f] vm_insnhelper.c:414
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x18d92f) [0x7fd2a8a8392f] vm_insnhelper.c:383
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x192036) [0x7fd2a8a88036] vm.c:1201
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(rb_iseq_eval+0x176) [0x7fd2a8a8e8f6] vm.c:1436
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x6f784) [0x7fd2a8965784] load.c:599
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(rb_require_safe+0x4ff) [0x7fd2a896757f] load.c:959
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(rb_protect+0xd7) [0x7fd2a8963307] eval.c:786
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(rb_autoload_load+0x10c) [0x7fd2a8a614fc] variable.c:1781
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x16b687) [0x7fd2a8a61687] variable.c:1841
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x189e48) [0x7fd2a8a7fe48] vm_insnhelper.c:450
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x192036) [0x7fd2a8a88036] vm.c:1201
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(rb_iseq_eval+0x176) [0x7fd2a8a8e8f6] vm.c:1436
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x6f784) [0x7fd2a8965784] load.c:599
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(rb_require_safe+0x4ff) [0x7fd2a896757f] load.c:959
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x187c06) [0x7fd2a8a7dc06] vm_insnhelper.c:1469
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x1965ff) [0x7fd2a8a8c5ff] vm_insnhelper.c:1559
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x18c2d2) [0x7fd2a8a822d2] insns.def:1017
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x192036) [0x7fd2a8a88036] vm.c:1201
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(rb_iseq_eval+0x176) [0x7fd2a8a8e8f6] vm.c:1436
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x6f784) [0x7fd2a8965784] load.c:599
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x6f8e8) [0x7fd2a89658e8] load.c:680
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x187c06) [0x7fd2a8a7dc06] vm_insnhelper.c:1469
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x1965ff) [0x7fd2a8a8c5ff] vm_insnhelper.c:1559
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x18c2d2) [0x7fd2a8a822d2] insns.def:1017
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x192036) [0x7fd2a8a88036] vm.c:1201
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(rb_iseq_eval+0x176) [0x7fd2a8a8e8f6] vm.c:1436
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x6f784) [0x7fd2a8965784] load.c:599
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x6f8e8) [0x7fd2a89658e8] load.c:680
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x187c06) [0x7fd2a8a7dc06] vm_insnhelper.c:1469
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x1965ff) [0x7fd2a8a8c5ff] vm_insnhelper.c:1559
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x18c2d2) [0x7fd2a8a822d2] insns.def:1017
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x192036) [0x7fd2a8a88036] vm.c:1201
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x19259c) [0x7fd2a8a8859c] vm_eval.c:1251
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x192a1f) [0x7fd2a8a88a1f] vm_eval.c:1292
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x187c06) [0x7fd2a8a7dc06] vm_insnhelper.c:1469
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x1965ff) [0x7fd2a8a8c5ff] vm_insnhelper.c:1559
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x18c2d2) [0x7fd2a8a822d2] insns.def:1017
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x192036) [0x7fd2a8a88036] vm.c:1201
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(rb_iseq_eval_main+0x8a) [0x7fd2a8a8e9da] vm.c:1449
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(+0x6b8c2) [0x7fd2a89618c2] eval.c:250
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(ruby_exec_node+0x1d) [0x7fd2a8962bad] eval.c:315
+/home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/../lib/libruby.so.2.0(ruby_run_node+0x1e) [0x7fd2a8964dae] eval.c:307
+/home/jam/.rvm/gems/ruby-2.0.0-p247@global/bin/rake() [0x40080b]
+/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed) [0x7fd2a855876d]
+/home/jam/.rvm/gems/ruby-2.0.0-p247@global/bin/rake() [0x400839]
+
+-- Other runtime information -----------------------------------------------
+
+* Loaded script: /home/jam/.rvm/gems/ruby-2.0.0-p247@global/bin/rake
+
+* Loaded features:
+
+ 0 enumerator.so
+ 1 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/enc/encdb.so
+ 2 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/enc/trans/transdb.so
+ 3 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/rbconfig.rb
+ 4 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/site_ruby/2.0.0/rubygems/compatibility.rb
+ 5 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/site_ruby/2.0.0/rubygems/defaults.rb
+ 6 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/site_ruby/2.0.0/rubygems/deprecate.rb
+ 7 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/site_ruby/2.0.0/rubygems/errors.rb
+ 8 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/site_ruby/2.0.0/rubygems/version.rb
+ 9 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/site_ruby/2.0.0/rubygems/requirement.rb
+ 10 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/site_ruby/2.0.0/rubygems/platform.rb
+ 11 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/site_ruby/2.0.0/rubygems/specification.rb
+ 12 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/site_ruby/2.0.0/rubygems/exceptions.rb
+ 13 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/site_ruby/2.0.0/rubygems/core_ext/kernel_gem.rb
+ 14 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/site_ruby/2.0.0/rubygems/core_ext/kernel_require.rb
+ 15 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/site_ruby/2.0.0/rubygems.rb
+ 16 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/pathname.so
+ 17 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/pathname.rb
+ 18 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/site_ruby/2.0.0/rubygems/user_interaction.rb
+ 19 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/etc.so
+ 20 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/site_ruby/2.0.0/rubygems/config_file.rb
+ 21 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/bundler-1.3.5/lib/bundler/rubygems_integration.rb
+ 22 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/site_ruby/2.0.0/rubygems/dependency.rb
+ 23 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/bundler-1.3.5/lib/bundler/shared_helpers.rb
+ 24 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/fileutils.rb
+ 25 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/bundler-1.3.5/lib/bundler/gem_path_manipulation.rb
+ 26 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/bundler-1.3.5/lib/bundler/gem_helpers.rb
+ 27 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/bundler-1.3.5/lib/bundler/match_platform.rb
+ 28 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/bundler-1.3.5/lib/bundler/rubygems_ext.rb
+ 29 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/bundler-1.3.5/lib/bundler/version.rb
+ 30 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/bundler-1.3.5/lib/bundler.rb
+ 31 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/bundler-1.3.5/lib/bundler/settings.rb
+ 32 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/site_ruby/2.0.0/rubygems/path_support.rb
+ 33 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/digest.so
+ 34 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/digest.rb
+ 35 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/digest/sha1.so
+ 36 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/set.rb
+ 37 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/bundler-1.3.5/lib/bundler/definition.rb
+ 38 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/bundler-1.3.5/lib/bundler/dependency.rb
+ 39 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/bundler-1.3.5/lib/bundler/ruby_dsl.rb
+ 40 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/bundler-1.3.5/lib/bundler/dsl.rb
+ 41 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/bundler-1.3.5/lib/bundler/source.rb
+ 42 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/uri/common.rb
+ 43 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/uri/generic.rb
+ 44 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/uri/ftp.rb
+ 45 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/uri/http.rb
+ 46 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/uri/https.rb
+ 47 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/uri/ldap.rb
+ 48 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/uri/ldaps.rb
+ 49 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/uri/mailto.rb
+ 50 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/uri.rb
+ 51 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/socket.so
+ 52 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/socket.rb
+ 53 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/fcntl.so
+ 54 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/timeout.rb
+ 55 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/thread.rb
+ 56 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/openssl.so
+ 57 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/openssl/bn.rb
+ 58 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/openssl/cipher.rb
+ 59 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/stringio.so
+ 60 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/openssl/config.rb
+ 61 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/openssl/digest.rb
+ 62 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/openssl/x509.rb
+ 63 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/openssl/buffering.rb
+ 64 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/openssl/ssl.rb
+ 65 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/openssl.rb
+ 66 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/securerandom.rb
+ 67 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/resolv.rb
+ 68 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/site_ruby/2.0.0/rubygems/remote_fetcher.rb
+ 69 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/site_ruby/2.0.0/rubygems/text.rb
+ 70 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/site_ruby/2.0.0/rubygems/name_tuple.rb
+ 71 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/site_ruby/2.0.0/rubygems/spec_fetcher.rb
+ 72 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/bundler-1.3.5/lib/bundler/source/rubygems.rb
+ 73 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/bundler-1.3.5/lib/bundler/source/path.rb
+ 74 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/strscan.so
+ 75 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/bundler-1.3.5/lib/bundler/source/git.rb
+ 76 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/bundler-1.3.5/lib/bundler/lockfile_parser.rb
+ 77 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/bundler-1.3.5/lib/bundler/lazy_specification.rb
+ 78 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/tsort.rb
+ 79 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/forwardable.rb
+ 80 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/bundler-1.3.5/lib/bundler/spec_set.rb
+ 81 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/bundler-1.3.5/lib/bundler/index.rb
+ 82 /home/jam/workspace/jam-cloud/websocket-gateway/lib/jam_websockets/version.rb
+ 83 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/bundler-1.3.5/lib/bundler/environment.rb
+ 84 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/bundler-1.3.5/lib/bundler/runtime.rb
+ 85 /home/jam/workspace/jam-cloud/db/target/ruby_package/lib/jam_db/version.rb
+ 86 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/bundler-1.3.5/lib/bundler/remote_specification.rb
+ 87 /home/jam/workspace/jam-cloud/ruby/lib/jam_ruby/version.rb
+ 88 /home/jam/workspace/jam-cloud/pb/target/ruby/jampb/lib/jampb/version.rb
+ 89 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/bundler-1.3.5/lib/bundler/dep_proxy.rb
+ 90 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/bundler-1.3.5/lib/bundler/resolver.rb
+ 91 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/bundler-1.3.5/lib/bundler/ui.rb
+ 92 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/bundler-1.3.5/lib/bundler/endpoint_specification.rb
+ 93 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/bundler-1.3.5/lib/bundler/setup.rb
+ 94 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/version.rb
+ 95 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/singleton.rb
+ 96 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/monitor.rb
+ 97 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/optparse.rb
+ 98 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/ostruct.rb
+ 99 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/ext/module.rb
+ 100 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/ext/core.rb
+ 101 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/ext/string.rb
+ 102 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/early_time.rb
+ 103 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/ext/time.rb
+ 104 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/alt_system.rb
+ 105 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/win32.rb
+ 106 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/linked_list.rb
+ 107 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/scope.rb
+ 108 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/task_argument_error.rb
+ 109 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/rule_recursion_overflow_error.rb
+ 110 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/shellwords.rb
+ 111 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/task_manager.rb
+ 112 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/cloneable.rb
+ 113 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/file_utils.rb
+ 114 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/file_utils_ext.rb
+ 115 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/pathmap.rb
+ 116 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/file_list.rb
+ 117 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/promise.rb
+ 118 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/thread_pool.rb
+ 119 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/private_reader.rb
+ 120 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/thread_history_display.rb
+ 121 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/trace_output.rb
+ 122 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/application.rb
+ 123 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/rake_module.rb
+ 124 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/pseudo_status.rb
+ 125 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/task_arguments.rb
+ 126 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/invocation_chain.rb
+ 127 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/invocation_exception_mixin.rb
+ 128 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/task.rb
+ 129 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/file_task.rb
+ 130 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/file_creation_task.rb
+ 131 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/multi_task.rb
+ 132 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/dsl_definition.rb
+ 133 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/default_loader.rb
+ 134 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/name_space.rb
+ 135 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/backtrace.rb
+ 136 /home/jam/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake.rb
+ 137 /home/jam/workspace/jam-cloud/web/config/boot.rb
+ 138 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/inflector/inflections.rb
+ 139 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/inflections.rb
+ 140 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/inflector/methods.rb
+ 141 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/lazy_load_hooks.rb
+ 142 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/dependencies/autoload.rb
+ 143 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/version.rb
+ 144 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support.rb
+ 145 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/i18n-0.6.5/lib/i18n/version.rb
+ 146 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/i18n-0.6.5/lib/i18n/exceptions.rb
+ 147 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/i18n-0.6.5/lib/i18n/interpolate/ruby.rb
+ 148 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/i18n-0.6.5/lib/i18n.rb
+ 149 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/i18n-0.6.5/lib/i18n/config.rb
+ 150 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/i18n.rb
+ 151 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activemodel-3.2.15/lib/active_model/version.rb
+ 152 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activemodel-3.2.15/lib/active_model.rb
+ 153 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/crud.rb
+ 154 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/factory_methods.rb
+ 155 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/expressions.rb
+ 156 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/predications.rb
+ 157 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/math.rb
+ 158 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/alias_predication.rb
+ 159 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/order_predications.rb
+ 160 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/table.rb
+ 161 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/attributes/attribute.rb
+ 162 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/attributes.rb
+ 163 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/compatibility/wheres.rb
+ 164 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/relation.rb
+ 165 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/expression.rb
+ 166 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/visitors/visitor.rb
+ 167 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/visitors/depth_first.rb
+ 168 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/bigdecimal.so
+ 169 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/date_core.so
+ 170 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/date/format.rb
+ 171 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/date.rb
+ 172 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/visitors/to_sql.rb
+ 173 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/visitors/sqlite.rb
+ 174 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/visitors/postgresql.rb
+ 175 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/visitors/mysql.rb
+ 176 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/visitors/mssql.rb
+ 177 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/visitors/oracle.rb
+ 178 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/visitors/join_sql.rb
+ 179 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/visitors/where_sql.rb
+ 180 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/visitors/order_clauses.rb
+ 181 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/visitors/dot.rb
+ 182 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/visitors/ibm_db.rb
+ 183 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/visitors/informix.rb
+ 184 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/visitors.rb
+ 185 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/tree_manager.rb
+ 186 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/insert_manager.rb
+ 187 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/select_manager.rb
+ 188 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/update_manager.rb
+ 189 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/delete_manager.rb
+ 190 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/nodes/node.rb
+ 191 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/nodes/select_statement.rb
+ 192 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/nodes/select_core.rb
+ 193 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/nodes/insert_statement.rb
+ 194 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/nodes/update_statement.rb
+ 195 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/nodes/terminal.rb
+ 196 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/nodes/true.rb
+ 197 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/nodes/false.rb
+ 198 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/nodes/unary.rb
+ 199 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/nodes/ascending.rb
+ 200 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/nodes/descending.rb
+ 201 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/nodes/unqualified_column.rb
+ 202 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/nodes/with.rb
+ 203 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/nodes/binary.rb
+ 204 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/nodes/equality.rb
+ 205 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/nodes/in.rb
+ 206 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/nodes/join_source.rb
+ 207 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/nodes/delete_statement.rb
+ 208 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/nodes/table_alias.rb
+ 209 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/nodes/infix_operation.rb
+ 210 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/nodes/and.rb
+ 211 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/nodes/function.rb
+ 212 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/nodes/count.rb
+ 213 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/nodes/values.rb
+ 214 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/nodes/named_function.rb
+ 215 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/nodes/inner_join.rb
+ 216 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/nodes/outer_join.rb
+ 217 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/nodes/string_join.rb
+ 218 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/nodes/sql_literal.rb
+ 219 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/nodes.rb
+ 220 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/deprecated.rb
+ 221 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/sql/engine.rb
+ 222 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel/sql_literal.rb
+ 223 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/arel-3.0.2/lib/arel.rb
+ 224 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/version.rb
+ 225 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/psych/syntax_error.rb
+ 226 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/psych.so
+ 227 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/psych/nodes/node.rb
+ 228 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/psych/nodes/stream.rb
+ 229 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/psych/nodes/document.rb
+ 230 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/psych/nodes/sequence.rb
+ 231 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/psych/nodes/scalar.rb
+ 232 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/psych/nodes/mapping.rb
+ 233 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/psych/nodes/alias.rb
+ 234 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/psych/nodes.rb
+ 235 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/psych/streaming.rb
+ 236 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/psych/visitors/visitor.rb
+ 237 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/psych/scalar_scanner.rb
+ 238 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/psych/visitors/to_ruby.rb
+ 239 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/psych/visitors/emitter.rb
+ 240 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/psych/visitors/yaml_tree.rb
+ 241 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/psych/json/ruby_events.rb
+ 242 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/psych/visitors/json_tree.rb
+ 243 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/psych/visitors/depth_first.rb
+ 244 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/psych/visitors.rb
+ 245 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/psych/handler.rb
+ 246 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/psych/tree_builder.rb
+ 247 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/psych/parser.rb
+ 248 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/psych/omap.rb
+ 249 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/psych/set.rb
+ 250 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/psych/coder.rb
+ 251 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/psych/core_ext.rb
+ 252 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/psych/deprecated.rb
+ 253 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/psych/stream.rb
+ 254 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/psych/json/yaml_events.rb
+ 255 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/psych/json/tree_builder.rb
+ 256 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/psych/json/stream.rb
+ 257 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/psych/handlers/document_stream.rb
+ 258 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/psych.rb
+ 259 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/yaml.rb
+ 260 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/ordered_hash.rb
+ 261 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/enumerable.rb
+ 262 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/notifications/fanout.rb
+ 263 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/notifications.rb
+ 264 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/array/wrap.rb
+ 265 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/deprecation/behaviors.rb
+ 266 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/deprecation/reporting.rb
+ 267 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/module/deprecation.rb
+ 268 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/module/aliasing.rb
+ 269 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/array/extract_options.rb
+ 270 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/deprecation/method_wrappers.rb
+ 271 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/deprecation/proxy_wrappers.rb
+ 272 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/deprecation.rb
+ 273 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/concern.rb
+ 274 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/hash/keys.rb
+ 275 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/kernel/singleton_class.rb
+ 276 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/module/remove_method.rb
+ 277 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/class/attribute.rb
+ 278 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activemodel-3.2.15/lib/active_model/attribute_methods.rb
+ 279 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/attribute_methods.rb
+ 280 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/bigdecimal/util.rb
+ 281 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/benchmark.rb
+ 282 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/benchmark.rb
+ 283 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/connection_adapters/schema_cache.rb
+ 284 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/big_decimal/conversions.rb
+ 285 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/connection_adapters/abstract/quoting.rb
+ 286 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/connection_adapters/abstract/database_statements.rb
+ 287 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/connection_adapters/abstract/schema_statements.rb
+ 288 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/connection_adapters/abstract/database_limits.rb
+ 289 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/connection_adapters/abstract/query_cache.rb
+ 290 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/descendants_tracker.rb
+ 291 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/kernel/reporting.rb
+ 292 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/object/inclusion.rb
+ 293 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/callbacks.rb
+ 294 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/connection_adapters/abstract_adapter.rb
+ 295 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/scoping.rb
+ 296 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record.rb
+ 297 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/railties-3.2.15/lib/rails/ruby_version_check.rb
+ 298 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/class/attribute_accessors.rb
+ 299 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/logger.rb
+ 300 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/logger.rb
+ 301 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/hash/reverse_merge.rb
+ 302 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/railties-3.2.15/lib/rails/initializable.rb
+ 303 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/ordered_options.rb
+ 304 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/hash/deep_dup.rb
+ 305 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/railties-3.2.15/lib/rails/paths.rb
+ 306 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/railties-3.2.15/lib/rails/rack.rb
+ 307 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/railties-3.2.15/lib/rails/configuration.rb
+ 308 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/module/attribute_accessors.rb
+ 309 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/multibyte/utils.rb
+ 310 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/multibyte.rb
+ 311 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/string/multibyte.rb
+ 312 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/inflector/transliterate.rb
+ 313 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/string/inflections.rb
+ 314 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/inflector.rb
+ 315 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/module/introspection.rb
+ 316 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/module/delegation.rb
+ 317 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/railties-3.2.15/lib/rails/railtie.rb
+ 318 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/railties-3.2.15/lib/rails/engine/railties.rb
+ 319 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/railties-3.2.15/lib/rails/engine.rb
+ 320 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/time.rb
+ 321 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/base64.rb
+ 322 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/base64.rb
+ 323 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/string/encoding.rb
+ 324 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/object/blank.rb
+ 325 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/xml_mini/rexml.rb
+ 326 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/xml_mini.rb
+ 327 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/array/conversions.rb
+ 328 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/railties-3.2.15/lib/rails/plugin.rb
+ 329 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/railties-3.2.15/lib/rails/application.rb
+ 330 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/railties-3.2.15/lib/rails/version.rb
+ 331 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/file_update_checker.rb
+ 332 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/railties-3.2.15/lib/rails/railtie/configurable.rb
+ 333 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/railties-3.2.15/lib/rails/railtie/configuration.rb
+ 334 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/i18n_railtie.rb
+ 335 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/railtie.rb
+ 336 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/actionpack-3.2.15/lib/action_pack/version.rb
+ 337 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/actionpack-3.2.15/lib/action_pack.rb
+ 338 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/rack-1.4.5/lib/rack.rb
+ 339 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/actionpack-3.2.15/lib/action_dispatch.rb
+ 340 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/actionpack-3.2.15/lib/action_dispatch/railtie.rb
+ 341 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/railties-3.2.15/lib/rails.rb
+ 342 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activemodel-3.2.15/lib/active_model/railtie.rb
+ 343 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/basic_object.rb
+ 344 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/object/acts_like.rb
+ 345 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/duration.rb
+ 346 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/object/try.rb
+ 347 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/values/time_zone.rb
+ 348 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/time_with_zone.rb
+ 349 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/time/zones.rb
+ 350 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/date/zones.rb
+ 351 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/date/calculations.rb
+ 352 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/time/publicize_conversion_methods.rb
+ 353 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/time/conversions.rb
+ 354 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/date_time/calculations.rb
+ 355 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/date_time/conversions.rb
+ 356 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/process/daemon.rb
+ 357 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/time/calculations.rb
+ 358 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/string/conversions.rb
+ 359 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/i18n-0.6.5/lib/i18n/core_ext/string/interpolate.rb
+ 360 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/string/interpolation.rb
+ 361 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/rexml/rexml.rb
+ 362 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/rexml.rb
+ 363 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/file/path.rb
+ 364 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/module/method_names.rb
+ 365 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/ruby/shim.rb
+ 366 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/module/attr_internal.rb
+ 367 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/module/anonymous.rb
+ 368 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/actionpack-3.2.15/lib/abstract_controller.rb
+ 369 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/cgi/util.rb
+ 370 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/erb.rb
+ 371 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/string/output_safety.rb
+ 372 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/actionpack-3.2.15/lib/action_view.rb
+ 373 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/actionpack-3.2.15/lib/action_controller/vendor/html-scanner.rb
+ 374 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/load_error.rb
+ 375 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/name_error.rb
+ 376 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/uri.rb
+ 377 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/actionpack-3.2.15/lib/action_controller.rb
+ 378 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/actionpack-3.2.15/lib/action_view/railtie.rb
+ 379 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/actionpack-3.2.15/lib/abstract_controller/railties/routes_helpers.rb
+ 380 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/actionpack-3.2.15/lib/action_controller/railties/paths.rb
+ 381 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/actionpack-3.2.15/lib/action_controller/railtie.rb
+ 382 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/railtie.rb
+ 383 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/actionmailer-3.2.15/lib/action_mailer/version.rb
+ 384 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/class/delegating_attributes.rb
+ 385 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/module/reachable.rb
+ 386 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/class/subclasses.rb
+ 387 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/class.rb
+ 388 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/array/uniq_by.rb
+ 389 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/actionmailer-3.2.15/lib/action_mailer.rb
+ 390 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/actionmailer-3.2.15/lib/action_mailer/railtie.rb
+ 391 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activeresource-3.2.15/lib/active_resource/exceptions.rb
+ 392 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activeresource-3.2.15/lib/active_resource/version.rb
+ 393 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activeresource-3.2.15/lib/active_resource.rb
+ 394 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activeresource-3.2.15/lib/active_resource/railtie.rb
+ 395 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/actionpack-3.2.15/lib/sprockets/railtie.rb
+ 396 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/benchmarkable.rb
+ 397 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/module/qualified_const.rb
+ 398 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/string/starts_ends_with.rb
+ 399 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/dependencies.rb
+ 400 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/time/marshal.rb
+ 401 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/time/acts_like.rb
+ 402 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/date/acts_like.rb
+ 403 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/date/freeze.rb
+ 404 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/date/conversions.rb
+ 405 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/date_time/acts_like.rb
+ 406 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/date_time/zones.rb
+ 407 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/integer/time.rb
+ 408 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/numeric/time.rb
+ 409 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/time.rb
+ 410 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/hash/deep_merge.rb
+ 411 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/hash_with_indifferent_access.rb
+ 412 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/hash/indifferent_access.rb
+ 413 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/hash/slice.rb
+ 414 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/string/behavior.rb
+ 415 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/object/duplicable.rb
+ 416 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/errors.rb
+ 417 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/log_subscriber.rb
+ 418 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/log_subscriber.rb
+ 419 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/explain_subscriber.rb
+ 420 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/persistence.rb
+ 421 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/hash/except.rb
+ 422 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activemodel-3.2.15/lib/active_model/naming.rb
+ 423 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/query_cache.rb
+ 424 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/querying.rb
+ 425 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/readonly_attributes.rb
+ 426 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/model_schema.rb
+ 427 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activemodel-3.2.15/lib/active_model/translation.rb
+ 428 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/translation.rb
+ 429 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/inheritance.rb
+ 430 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/scoping/default.rb
+ 431 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/array/access.rb
+ 432 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/array/grouping.rb
+ 433 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/array/random_access.rb
+ 434 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/array/prepend_and_append.rb
+ 435 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/array.rb
+ 436 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/scoping/named.rb
+ 437 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/dynamic_matchers.rb
+ 438 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/sanitization.rb
+ 439 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activemodel-3.2.15/lib/active_model/mass_assignment_security/permission_set.rb
+ 440 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activemodel-3.2.15/lib/active_model/mass_assignment_security/sanitizer.rb
+ 441 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activemodel-3.2.15/lib/active_model/mass_assignment_security.rb
+ 442 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/attribute_assignment.rb
+ 443 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activemodel-3.2.15/lib/active_model/conversion.rb
+ 444 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/integration.rb
+ 445 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activemodel-3.2.15/lib/active_model/errors.rb
+ 446 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activemodel-3.2.15/lib/active_model/validations/callbacks.rb
+ 447 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activemodel-3.2.15/lib/active_model/validator.rb
+ 448 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activemodel-3.2.15/lib/active_model/validations/acceptance.rb
+ 449 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activemodel-3.2.15/lib/active_model/validations/confirmation.rb
+ 450 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/range/blockless_step.rb
+ 451 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/range/conversions.rb
+ 452 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/range/include_range.rb
+ 453 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/range/overlaps.rb
+ 454 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/range/cover.rb
+ 455 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/core_ext/range.rb
+ 456 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activemodel-3.2.15/lib/active_model/validations/exclusion.rb
+ 457 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activemodel-3.2.15/lib/active_model/validations/format.rb
+ 458 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activemodel-3.2.15/lib/active_model/validations/inclusion.rb
+ 459 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activemodel-3.2.15/lib/active_model/validations/length.rb
+ 460 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activemodel-3.2.15/lib/active_model/validations/numericality.rb
+ 461 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activemodel-3.2.15/lib/active_model/validations/presence.rb
+ 462 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activemodel-3.2.15/lib/active_model/validations/validates.rb
+ 463 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activemodel-3.2.15/lib/active_model/validations/with.rb
+ 464 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activemodel-3.2.15/lib/active_model/validations.rb
+ 465 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/validations/associated.rb
+ 466 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/validations/uniqueness.rb
+ 467 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/validations.rb
+ 468 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/counter_cache.rb
+ 469 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/locking/optimistic.rb
+ 470 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/locking/pessimistic.rb
+ 471 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/attribute_methods/read.rb
+ 472 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/attribute_methods/write.rb
+ 473 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/attribute_methods/before_type_cast.rb
+ 474 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/attribute_methods/query.rb
+ 475 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/attribute_methods/primary_key.rb
+ 476 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/attribute_methods/time_zone_conversion.rb
+ 477 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activemodel-3.2.15/lib/active_model/dirty.rb
+ 478 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/attribute_methods/dirty.rb
+ 479 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/timestamp.rb
+ 480 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/attribute_methods/serialization.rb
+ 481 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/attribute_methods/deprecated_underscore_read.rb
+ 482 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/callbacks.rb
+ 483 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activemodel-3.2.15/lib/active_model/observer_array.rb
+ 484 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activemodel-3.2.15/lib/active_model/observing.rb
+ 485 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activemodel-3.2.15/lib/active_model/callbacks.rb
+ 486 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/associations.rb
+ 487 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/identity_map.rb
+ 488 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activemodel-3.2.15/lib/active_model/secure_password.rb
+ 489 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/explain.rb
+ 490 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/autosave_association.rb
+ 491 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/nested_attributes.rb
+ 492 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/associations/builder/association.rb
+ 493 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/associations/builder/singular_association.rb
+ 494 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/associations/builder/has_one.rb
+ 495 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/associations/builder/collection_association.rb
+ 496 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/associations/builder/has_many.rb
+ 497 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/associations/builder/belongs_to.rb
+ 498 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/associations/builder/has_and_belongs_to_many.rb
+ 499 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/aggregations.rb
+ 500 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/transactions.rb
+ 501 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activerecord-3.2.15/lib/active_record/reflection.rb
+ 502 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/multi_json-1.8.2/lib/multi_json/options.rb
+ 503 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/multi_json-1.8.2/lib/multi_json/version.rb
+ 504 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/multi_json-1.8.2/lib/multi_json/load_error.rb
+ 505 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/multi_json-1.8.2/lib/multi_json.rb
+ 506 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-3.2.15/lib/active_support/json/decoding.rb
+ 507 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/json-1.8.1/lib/json/version.rb
+ 508 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/json-1.8.1/lib/json/generic_object.rb
+ 509 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/json-1.8.1/lib/json/common.rb
+ 510 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/enc/utf_16be.so
+ 511 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/enc/utf_16le.so
+ 512 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/enc/utf_32be.so
+ 513 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/enc/utf_32le.so
+ 514 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/json-1.8.1/lib/json/ext/parser.so
+ 515 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/json-1.8.1/lib/json/ext/generator.so
+
+* Process memory map:
+
+00400000-00401000 r-xp 00000000 fc:00 2230335 /home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/ruby
+00600000-00601000 r--p 00000000 fc:00 2230335 /home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/ruby
+00601000-00602000 rw-p 00001000 fc:00 2230335 /home/jam/.rvm/rubies/ruby-2.0.0-p247/bin/ruby
+00cbb000-02b22000 rw-p 00000000 00:00 0 [heap]
+7fd2a3d80000-7fd2a3d95000 r-xp 00000000 fc:00 1572908 /lib/x86_64-linux-gnu/libgcc_s.so.1
+7fd2a3d95000-7fd2a3f94000 ---p 00015000 fc:00 1572908 /lib/x86_64-linux-gnu/libgcc_s.so.1
+7fd2a3f94000-7fd2a3f95000 r--p 00014000 fc:00 1572908 /lib/x86_64-linux-gnu/libgcc_s.so.1
+7fd2a3f95000-7fd2a3f96000 rw-p 00015000 fc:00 1572908 /lib/x86_64-linux-gnu/libgcc_s.so.1
+7fd2a3f96000-7fd2a3f9e000 r-xp 00000000 fc:00 2493168 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/json-1.8.1/lib/json/ext/generator.so
+7fd2a3f9e000-7fd2a419d000 ---p 00008000 fc:00 2493168 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/json-1.8.1/lib/json/ext/generator.so
+7fd2a419d000-7fd2a419e000 r--p 00007000 fc:00 2493168 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/json-1.8.1/lib/json/ext/generator.so
+7fd2a419e000-7fd2a419f000 rw-p 00008000 fc:00 2493168 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/json-1.8.1/lib/json/ext/generator.so
+7fd2a419f000-7fd2a41a0000 r-xp 00000000 fc:00 2229480 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/enc/utf_32le.so
+7fd2a41a0000-7fd2a439f000 ---p 00001000 fc:00 2229480 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/enc/utf_32le.so
+7fd2a439f000-7fd2a43a0000 r--p 00000000 fc:00 2229480 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/enc/utf_32le.so
+7fd2a43a0000-7fd2a43a1000 rw-p 00001000 fc:00 2229480 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/enc/utf_32le.so
+7fd2a43a1000-7fd2a43a2000 r-xp 00000000 fc:00 2229448 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/enc/utf_32be.so
+7fd2a43a2000-7fd2a45a1000 ---p 00001000 fc:00 2229448 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/enc/utf_32be.so
+7fd2a45a1000-7fd2a45a2000 r--p 00000000 fc:00 2229448 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/enc/utf_32be.so
+7fd2a45a2000-7fd2a45a3000 rw-p 00001000 fc:00 2229448 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/enc/utf_32be.so
+7fd2a45a3000-7fd2a45a4000 r-xp 00000000 fc:00 2229439 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/enc/utf_16le.so
+7fd2a45a4000-7fd2a47a3000 ---p 00001000 fc:00 2229439 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/enc/utf_16le.so
+7fd2a47a3000-7fd2a47a4000 r--p 00000000 fc:00 2229439 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/enc/utf_16le.so
+7fd2a47a4000-7fd2a47a5000 rw-p 00001000 fc:00 2229439 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/enc/utf_16le.so
+7fd2a47a5000-7fd2a47a6000 r-xp 00000000 fc:00 2229440 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/enc/utf_16be.so
+7fd2a47a6000-7fd2a49a5000 ---p 00001000 fc:00 2229440 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/enc/utf_16be.so
+7fd2a49a5000-7fd2a49a6000 r--p 00000000 fc:00 2229440 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/enc/utf_16be.so
+7fd2a49a6000-7fd2a49a7000 rw-p 00001000 fc:00 2229440 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/enc/utf_16be.so
+7fd2a49a7000-7fd2a4b97000 r-xp 00000000 fc:00 938271 /usr/lib/libruby-1.9.1.so.1.9.1
+7fd2a4b97000-7fd2a4d96000 ---p 001f0000 fc:00 938271 /usr/lib/libruby-1.9.1.so.1.9.1
+7fd2a4d96000-7fd2a4d9b000 r--p 001ef000 fc:00 938271 /usr/lib/libruby-1.9.1.so.1.9.1
+7fd2a4d9b000-7fd2a4d9f000 rw-p 001f4000 fc:00 938271 /usr/lib/libruby-1.9.1.so.1.9.1
+7fd2a4d9f000-7fd2a4dbb000 rw-p 00000000 00:00 0
+7fd2a4dbb000-7fd2a4dc1000 r-xp 00000000 fc:00 2493172 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/json-1.8.1/lib/json/ext/parser.so
+7fd2a4dc1000-7fd2a4fc0000 ---p 00006000 fc:00 2493172 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/json-1.8.1/lib/json/ext/parser.so
+7fd2a4fc0000-7fd2a4fc1000 r--p 00005000 fc:00 2493172 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/json-1.8.1/lib/json/ext/parser.so
+7fd2a4fc1000-7fd2a4fc2000 rw-p 00006000 fc:00 2493172 /home/jam/.rvm/gems/ruby-2.0.0-p247/gems/json-1.8.1/lib/json/ext/parser.so
+7fd2a4fc2000-7fd2a4fe2000 r-xp 00000000 fc:00 938243 /usr/lib/x86_64-linux-gnu/libyaml-0.so.2.0.2
+7fd2a4fe2000-7fd2a51e1000 ---p 00020000 fc:00 938243 /usr/lib/x86_64-linux-gnu/libyaml-0.so.2.0.2
+7fd2a51e1000-7fd2a51e2000 r--p 0001f000 fc:00 938243 /usr/lib/x86_64-linux-gnu/libyaml-0.so.2.0.2
+7fd2a51e2000-7fd2a51e3000 rw-p 00020000 fc:00 938243 /usr/lib/x86_64-linux-gnu/libyaml-0.so.2.0.2
+7fd2a51e3000-7fd2a51e9000 r-xp 00000000 fc:00 2229434 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/psych.so
+7fd2a51e9000-7fd2a53e8000 ---p 00006000 fc:00 2229434 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/psych.so
+7fd2a53e8000-7fd2a53e9000 r--p 00005000 fc:00 2229434 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/psych.so
+7fd2a53e9000-7fd2a53ea000 rw-p 00006000 fc:00 2229434 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/psych.so
+7fd2a53ea000-7fd2a541c000 r-xp 00000000 fc:00 2229497 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/date_core.so
+7fd2a541c000-7fd2a561c000 ---p 00032000 fc:00 2229497 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/date_core.so
+7fd2a561c000-7fd2a561d000 r--p 00032000 fc:00 2229497 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/date_core.so
+7fd2a561d000-7fd2a561e000 rw-p 00033000 fc:00 2229497 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/date_core.so
+7fd2a561e000-7fd2a5620000 rw-p 00000000 00:00 0
+7fd2a5620000-7fd2a5634000 r-xp 00000000 fc:00 2229399 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/bigdecimal.so
+7fd2a5634000-7fd2a5833000 ---p 00014000 fc:00 2229399 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/bigdecimal.so
+7fd2a5833000-7fd2a5834000 r--p 00013000 fc:00 2229399 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/bigdecimal.so
+7fd2a5834000-7fd2a5835000 rw-p 00014000 fc:00 2229399 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/bigdecimal.so
+7fd2a5835000-7fd2a583a000 r-xp 00000000 fc:00 2229498 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/strscan.so
+7fd2a583a000-7fd2a5a39000 ---p 00005000 fc:00 2229498 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/strscan.so
+7fd2a5a39000-7fd2a5a3a000 r--p 00004000 fc:00 2229498 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/strscan.so
+7fd2a5a3a000-7fd2a5a3b000 rw-p 00005000 fc:00 2229498 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/strscan.so
+7fd2a5a3b000-7fd2a5a42000 r-xp 00000000 fc:00 2229401 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/stringio.so
+7fd2a5a42000-7fd2a5c41000 ---p 00007000 fc:00 2229401 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/stringio.so
+7fd2a5c41000-7fd2a5c42000 r--p 00006000 fc:00 2229401 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/stringio.so
+7fd2a5c42000-7fd2a5c43000 rw-p 00007000 fc:00 2229401 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/stringio.so
+7fd2a5c43000-7fd2a5c95000 r-xp 00000000 fc:00 1572880 /lib/x86_64-linux-gnu/libssl.so.1.0.0
+7fd2a5c95000-7fd2a5e95000 ---p 00052000 fc:00 1572880 /lib/x86_64-linux-gnu/libssl.so.1.0.0
+7fd2a5e95000-7fd2a5e98000 r--p 00052000 fc:00 1572880 /lib/x86_64-linux-gnu/libssl.so.1.0.0
+7fd2a5e98000-7fd2a5e9e000 rw-p 00055000 fc:00 1572880 /lib/x86_64-linux-gnu/libssl.so.1.0.0
+7fd2a5e9e000-7fd2a5e9f000 rw-p 00000000 00:00 0
+7fd2a5e9f000-7fd2a5eed000 r-xp 00000000 fc:00 2229414 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/openssl.so
+7fd2a5eed000-7fd2a60ed000 ---p 0004e000 fc:00 2229414 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/openssl.so
+7fd2a60ed000-7fd2a60ee000 r--p 0004e000 fc:00 2229414 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/openssl.so
+7fd2a60ee000-7fd2a60f0000 rw-p 0004f000 fc:00 2229414 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/openssl.so
+7fd2a60f0000-7fd2a60f1000 rw-p 00000000 00:00 0
+7fd2a60f1000-7fd2a60f2000 r-xp 00000000 fc:00 2229402 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/fcntl.so
+7fd2a60f2000-7fd2a62f1000 ---p 00001000 fc:00 2229402 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/fcntl.so
+7fd2a62f1000-7fd2a62f2000 r--p 00000000 fc:00 2229402 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/fcntl.so
+7fd2a62f2000-7fd2a62f3000 rw-p 00001000 fc:00 2229402 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/fcntl.so
+7fd2a62f3000-7fd2a6316000 r-xp 00000000 fc:00 2229409 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/socket.so
+7fd2a6316000-7fd2a6516000 ---p 00023000 fc:00 2229409 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/socket.so
+7fd2a6516000-7fd2a6517000 r--p 00023000 fc:00 2229409 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/socket.so
+7fd2a6517000-7fd2a6518000 rw-p 00024000 fc:00 2229409 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/socket.so
+7fd2a6518000-7fd2a651b000 r-xp 00000000 fc:00 2229502 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/digest.so
+7fd2a651b000-7fd2a671a000 ---p 00003000 fc:00 2229502 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/digest.so
+7fd2a671a000-7fd2a671b000 r--p 00002000 fc:00 2229502 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/digest.so
+7fd2a671b000-7fd2a671c000 rw-p 00003000 fc:00 2229502 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/digest.so
+7fd2a671c000-7fd2a6732000 r-xp 00000000 fc:00 1573092 /lib/x86_64-linux-gnu/libz.so.1.2.3.4
+7fd2a6732000-7fd2a6931000 ---p 00016000 fc:00 1573092 /lib/x86_64-linux-gnu/libz.so.1.2.3.4
+7fd2a6931000-7fd2a6932000 r--p 00015000 fc:00 1573092 /lib/x86_64-linux-gnu/libz.so.1.2.3.4
+7fd2a6932000-7fd2a6933000 rw-p 00016000 fc:00 1573092 /lib/x86_64-linux-gnu/libz.so.1.2.3.4
+7fd2a6933000-7fd2a6ad2000 r-xp 00000000 fc:00 1572883 /lib/x86_64-linux-gnu/libcrypto.so.1.0.0
+7fd2a6ad2000-7fd2a6cd1000 ---p 0019f000 fc:00 1572883 /lib/x86_64-linux-gnu/libcrypto.so.1.0.0
+7fd2a6cd1000-7fd2a6cec000 r--p 0019e000 fc:00 1572883 /lib/x86_64-linux-gnu/libcrypto.so.1.0.0
+7fd2a6cec000-7fd2a6cf7000 rw-p 001b9000 fc:00 1572883 /lib/x86_64-linux-gnu/libcrypto.so.1.0.0
+7fd2a6cf7000-7fd2a6cfb000 rw-p 00000000 00:00 0
+7fd2a6cfb000-7fd2a6cfc000 r-xp 00000000 fc:00 2229423 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/digest/sha1.so
+7fd2a6cfc000-7fd2a6efb000 ---p 00001000 fc:00 2229423 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/digest/sha1.so
+7fd2a6efb000-7fd2a6efc000 r--p 00000000 fc:00 2229423 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/digest/sha1.so
+7fd2a6efc000-7fd2a6efd000 rw-p 00001000 fc:00 2229423 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/digest/sha1.so
+7fd2a6efd000-7fd2a6f00000 r-xp 00000000 fc:00 2229429 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/etc.so
+7fd2a6f00000-7fd2a70ff000 ---p 00003000 fc:00 2229429 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/etc.so
+7fd2a70ff000-7fd2a7100000 r--p 00002000 fc:00 2229429 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/etc.so
+7fd2a7100000-7fd2a7101000 rw-p 00003000 fc:00 2229429 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/etc.so
+7fd2a7101000-7fd2a7108000 r-xp 00000000 fc:00 2229501 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/pathname.so
+7fd2a7108000-7fd2a7307000 ---p 00007000 fc:00 2229501 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/pathname.so
+7fd2a7307000-7fd2a7308000 r--p 00006000 fc:00 2229501 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/pathname.so
+7fd2a7308000-7fd2a7309000 rw-p 00007000 fc:00 2229501 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/pathname.so
+7fd2a7309000-7fd2a730b000 r-xp 00000000 fc:00 2229473 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/enc/trans/transdb.so
+7fd2a730b000-7fd2a750b000 ---p 00002000 fc:00 2229473 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/enc/trans/transdb.so
+7fd2a750b000-7fd2a750c000 r--p 00002000 fc:00 2229473 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/enc/trans/transdb.so
+7fd2a750c000-7fd2a750d000 rw-p 00003000 fc:00 2229473 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/enc/trans/transdb.so
+7fd2a750d000-7fd2a750f000 r-xp 00000000 fc:00 2229441 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/enc/encdb.so
+7fd2a750f000-7fd2a770e000 ---p 00002000 fc:00 2229441 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/enc/encdb.so
+7fd2a770e000-7fd2a770f000 r--p 00001000 fc:00 2229441 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/enc/encdb.so
+7fd2a770f000-7fd2a7710000 rw-p 00002000 fc:00 2229441 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/x86_64-linux/enc/encdb.so
+7fd2a7710000-7fd2a79d9000 r--p 00000000 fc:00 923218 /usr/lib/locale/locale-archive
+7fd2a79d9000-7fd2a7ad4000 r-xp 00000000 fc:00 1578039 /lib/x86_64-linux-gnu/libm-2.15.so
+7fd2a7ad4000-7fd2a7cd3000 ---p 000fb000 fc:00 1578039 /lib/x86_64-linux-gnu/libm-2.15.so
+7fd2a7cd3000-7fd2a7cd4000 r--p 000fa000 fc:00 1578039 /lib/x86_64-linux-gnu/libm-2.15.so
+7fd2a7cd4000-7fd2a7cd5000 rw-p 000fb000 fc:00 1578039 /lib/x86_64-linux-gnu/libm-2.15.so
+7fd2a7cd5000-7fd2a7cde000 r-xp 00000000 fc:00 1578040 /lib/x86_64-linux-gnu/libcrypt-2.15.so
+7fd2a7cde000-7fd2a7ede000 ---p 00009000 fc:00 1578040 /lib/x86_64-linux-gnu/libcrypt-2.15.so
+7fd2a7ede000-7fd2a7edf000 r--p 00009000 fc:00 1578040 /lib/x86_64-linux-gnu/libcrypt-2.15.so
+7fd2a7edf000-7fd2a7ee0000 rw-p 0000a000 fc:00 1578040 /lib/x86_64-linux-gnu/libcrypt-2.15.so
+7fd2a7ee0000-7fd2a7f0e000 rw-p 00000000 00:00 0
+7fd2a7f0e000-7fd2a7f10000 r-xp 00000000 fc:00 1578030 /lib/x86_64-linux-gnu/libdl-2.15.so
+7fd2a7f10000-7fd2a8110000 ---p 00002000 fc:00 1578030 /lib/x86_64-linux-gnu/libdl-2.15.so
+7fd2a8110000-7fd2a8111000 r--p 00002000 fc:00 1578030 /lib/x86_64-linux-gnu/libdl-2.15.so
+7fd2a8111000-7fd2a8112000 rw-p 00003000 fc:00 1578030 /lib/x86_64-linux-gnu/libdl-2.15.so
+7fd2a8112000-7fd2a8119000 r-xp 00000000 fc:00 1578035 /lib/x86_64-linux-gnu/librt-2.15.so
+7fd2a8119000-7fd2a8318000 ---p 00007000 fc:00 1578035 /lib/x86_64-linux-gnu/librt-2.15.so
+7fd2a8318000-7fd2a8319000 r--p 00006000 fc:00 1578035 /lib/x86_64-linux-gnu/librt-2.15.so
+7fd2a8319000-7fd2a831a000 rw-p 00007000 fc:00 1578035 /lib/x86_64-linux-gnu/librt-2.15.so
+7fd2a831a000-7fd2a8332000 r-xp 00000000 fc:00 1578033 /lib/x86_64-linux-gnu/libpthread-2.15.so
+7fd2a8332000-7fd2a8531000 ---p 00018000 fc:00 1578033 /lib/x86_64-linux-gnu/libpthread-2.15.so
+7fd2a8531000-7fd2a8532000 r--p 00017000 fc:00 1578033 /lib/x86_64-linux-gnu/libpthread-2.15.so
+7fd2a8532000-7fd2a8533000 rw-p 00018000 fc:00 1578033 /lib/x86_64-linux-gnu/libpthread-2.15.so
+7fd2a8533000-7fd2a8537000 rw-p 00000000 00:00 0
+7fd2a8537000-7fd2a86ec000 r-xp 00000000 fc:00 1578031 /lib/x86_64-linux-gnu/libc-2.15.so
+7fd2a86ec000-7fd2a88eb000 ---p 001b5000 fc:00 1578031 /lib/x86_64-linux-gnu/libc-2.15.so
+7fd2a88eb000-7fd2a88ef000 r--p 001b4000 fc:00 1578031 /lib/x86_64-linux-gnu/libc-2.15.so
+7fd2a88ef000-7fd2a88f1000 rw-p 001b8000 fc:00 1578031 /lib/x86_64-linux-gnu/libc-2.15.so
+7fd2a88f1000-7fd2a88f6000 rw-p 00000000 00:00 0
+7fd2a88f6000-7fd2a8b4a000 r-xp 00000000 fc:00 2229274 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/libruby.so.2.0.0
+7fd2a8b4a000-7fd2a8d49000 ---p 00254000 fc:00 2229274 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/libruby.so.2.0.0
+7fd2a8d49000-7fd2a8d4e000 r--p 00253000 fc:00 2229274 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/libruby.so.2.0.0
+7fd2a8d4e000-7fd2a8d51000 rw-p 00258000 fc:00 2229274 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/libruby.so.2.0.0
+7fd2a8d51000-7fd2a8d72000 rw-p 00000000 00:00 0
+7fd2a8d72000-7fd2a8d94000 r-xp 00000000 fc:00 1578045 /lib/x86_64-linux-gnu/ld-2.15.so
+7fd2a8e6c000-7fd2a8e6d000 r--s 00000000 fc:00 2231868 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/gems/2.0.0/bin/rake
+7fd2a8e7f000-7fd2a8f86000 rw-p 00000000 00:00 0
+7fd2a8f86000-7fd2a8f87000 r--s 00000000 fc:00 2231868 /home/jam/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/gems/2.0.0/bin/rake
+7fd2a8f87000-7fd2a8f8e000 r--s 00000000 fc:00 929597 /usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache
+7fd2a8f8e000-7fd2a8f8f000 ---p 00000000 00:00 0
+7fd2a8f8f000-7fd2a8f94000 rw-p 00000000 00:00 0
+7fd2a8f94000-7fd2a8f95000 r--p 00022000 fc:00 1578045 /lib/x86_64-linux-gnu/ld-2.15.so
+7fd2a8f95000-7fd2a8f97000 rw-p 00023000 fc:00 1578045 /lib/x86_64-linux-gnu/ld-2.15.so
+7fff9c15f000-7fff9c1e3000 rw-p 00000000 00:00 0 [stack]
+7fff9c1ff000-7fff9c200000 r-xp 00000000 00:00 0 [vdso]
+ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
+
+
+[NOTE]
+You may have encountered a bug in the Ruby interpreter or extension libraries.
+Bug reports are welcome.
+For details: http://www.ruby-lang.org/bugreport.html
+
+Aborted (core dumped)
diff --git a/web/spec/controllers/api_affiliate_controller_spec.rb b/web/spec/controllers/api_affiliate_controller_spec.rb
new file mode 100644
index 000000000..93306844d
--- /dev/null
+++ b/web/spec/controllers/api_affiliate_controller_spec.rb
@@ -0,0 +1,82 @@
+require 'spec_helper'
+
+describe ApiAffiliateController do
+ render_views
+
+ let(:partner1) {FactoryGirl.create(:affiliate_partner)}
+ let(:user_partner1) { partner1.partner_user }
+ let(:partner2) {FactoryGirl.create(:affiliate_partner)}
+ let(:user_partner2) { partner2.partner_user }
+
+ before(:each) do
+ controller.current_user = user_partner1
+ end
+
+ describe "traffic_index" do
+ it "empty" do
+ get :traffic_index
+ response.should be_success
+ JSON.parse(response.body)['traffics'].should eq([])
+ end
+
+ it "single item" do
+ traffic_total = FactoryGirl.create(:affiliate_traffic_total, affiliate_partner: partner1, visits: 5, signups: 0, day:Date.today)
+
+ get :traffic_index
+ response.should be_success
+ JSON.parse(response.body)['traffics'].should eq([{"day" => Date.today.to_s, "visits" => 5, "signups" => 0, "affiliate_partner_id" => partner1.id}])
+ end
+ end
+
+ describe "monthly_index" do
+ it "empty" do
+ get :monthly_index
+ response.should be_success
+ JSON.parse(response.body)['monthlies'].should eq([])
+ end
+
+ it "single item" do
+ monthly = FactoryGirl.create(:affiliate_monthly_payment, affiliate_partner: partner1, closed: true, due_amount_in_cents: 20, month: 1, year: 2015)
+
+ get :monthly_index
+ response.should be_success
+ JSON.parse(response.body)['monthlies'].should eq([{"closed" => true, "month" => 1, "year" => 2015, "due_amount_in_cents" => 20, "affiliate_partner_id" => partner1.id}])
+ end
+ end
+
+
+ describe "quarterly_index" do
+ it "empty" do
+ get :quarterly_index
+ response.should be_success
+ JSON.parse(response.body)['quarterlies'].should eq([])
+ end
+
+ it "single item" do
+ quarterly = FactoryGirl.create(:affiliate_quarterly_payment, affiliate_partner: partner1, paid: true, closed: true, due_amount_in_cents: 20, quarter: 1, year: 2015)
+
+ get :quarterly_index
+ response.should be_success
+ JSON.parse(response.body)['quarterlies'].should eq([{"closed" => true, "paid" => true, "quarter" => 1, "year" => 2015, "due_amount_in_cents" => 20, "affiliate_partner_id" => partner1.id}])
+ end
+
+
+ it "not paid is excluded" do
+ quarterly = FactoryGirl.create(:affiliate_quarterly_payment, affiliate_partner: partner1, paid: false, closed: true, due_amount_in_cents: 20, quarter: 1, year: 2015)
+
+ get :quarterly_index
+ response.should be_success
+ JSON.parse(response.body)['quarterlies'].should eq([])
+ end
+
+
+ it "not closed is excluded" do
+ quarterly = FactoryGirl.create(:affiliate_quarterly_payment, affiliate_partner: partner1, paid: true, closed: false, due_amount_in_cents: 20, quarter: 1, year: 2015)
+
+ get :quarterly_index
+ response.should be_success
+ JSON.parse(response.body)['quarterlies'].should eq([])
+ end
+ end
+
+end
diff --git a/web/spec/controllers/api_jam_tracks_controller_spec.rb b/web/spec/controllers/api_jam_tracks_controller_spec.rb
index fc4685eb9..74bc1da94 100644
--- a/web/spec/controllers/api_jam_tracks_controller_spec.rb
+++ b/web/spec/controllers/api_jam_tracks_controller_spec.rb
@@ -15,6 +15,8 @@ describe ApiJamTracksController do
end
before(:each) do
+ FingerprintWhitelist.destroy_all
+ FraudAlert.destroy_all
MachineFingerprint.destroy_all
JamTrackRight.destroy_all
JamTrack.destroy_all
@@ -299,6 +301,9 @@ describe ApiJamTracksController do
describe "guard fraud" do
+ after(:each) do
+ ENV['RAILS_TEST_IP_ADDRESS'] = nil
+ end
it "stops second user from downloading using same machine" do
right = JamTrackRight.create(:user=>@user, :jam_track=>@jam_track)
@@ -306,6 +311,7 @@ describe ApiJamTracksController do
right.save!
get :download, :id=>@jam_track.id, sample_rate: 48, all_fp: 'all', running_fp: 'running'
response.status.should == 202
+ MachineFingerprint.count.should eq(2)
user2 = FactoryGirl.create(:user)
@@ -315,8 +321,10 @@ describe ApiJamTracksController do
right.redeemed = true
right.save!
get :download, :id=>@jam_track.id, sample_rate: 48, all_fp: 'all', running_fp: 'running'
- response.status.should == 403
- JSON.parse(response.body)['message'].should eq("other user has 'all' fingerprint")
+ response.status.should == 202
+
+ # no error for the user... but we should have a FraudAlert
+ FraudAlert.count.should eq(1)
end
it "stops second user from enqueuing using same machine" do
@@ -336,9 +344,10 @@ describe ApiJamTracksController do
right.save!
right.signing_queued_at.should be_nil
post :enqueue, {:format=>'json', :id=>right.jam_track.id, fingerprint: {all: 'all', running: 'running'} }
+ response.status.should == 200
get :download, :id=>@jam_track.id, sample_rate: 48, all_fp: 'all', running_fp: 'running'
- response.status.should == 403
- JSON.parse(response.body)['message'].should eq("other user has 'all' fingerprint")
+ response.status.should == 202
+ FraudAlert.count.should eq(1)
end
end
end
diff --git a/web/spec/controllers/api_links_controller_spec.rb b/web/spec/controllers/api_links_controller_spec.rb
new file mode 100644
index 000000000..297789693
--- /dev/null
+++ b/web/spec/controllers/api_links_controller_spec.rb
@@ -0,0 +1,106 @@
+require 'spec_helper'
+
+describe ApiLinksController do
+ render_views
+
+ let(:partner1) {FactoryGirl.create(:affiliate_partner)}
+ let(:user_partner1) { partner1.partner_user }
+
+ before(:each) do
+ ClaimedRecording.delete_all
+ Recording.delete_all
+ MusicSession.delete_all
+ JamTrackRight.delete_all
+ JamTrack.delete_all
+ controller.current_user = nil
+ end
+
+ describe "jamtrack_song_index" do
+ it "succeeds with empty data" do
+ get :jamtrack_song_index, format:'json', affiliate_id: partner1.id
+ response.status.should eq(200)
+ body = JSON.parse(response.body)
+ body.length.should eq(0)
+ end
+
+ it "succeeds with data" do
+ jam_track = FactoryGirl.create(:jam_track)
+ get :jamtrack_song_index, format:'json', affiliate_id: partner1.id
+ response.status.should eq(200)
+ body = JSON.parse(response.body)
+ body.length.should eq(1)
+ body[0]['url'].should_not be_nil
+ body[0]['target'].should_not be_nil
+ end
+ end
+
+ describe "jamkazam_general_index" do
+ it "succeeds" do
+ get :jamkazam_general_index, format:'json', affiliate_id: partner1.id
+ response.status.should eq(200)
+ body = JSON.parse(response.body)
+ body.length.should eq(3)
+ end
+ end
+
+
+ describe "session_index" do
+ let(:open_params) {
+ {
+ name: "session 1",
+ description: "my session",
+ genres: ['ambient'],
+ musician_access: true,
+ fan_access: true,
+ approval_required: true,
+ fan_chat: true,
+ legal_policy: 'Standard',
+ language: 'eng',
+ start: "Thu Jul 10 2020 10:00 PM",
+ duration: 30,
+ timezone: "Central Time (US & Canada),America/Chicago",
+ open_rsvps: true,
+ legal_terms: true,
+ recurring_mode: 'once',
+ isUnstructuredRsvp: true,
+ rsvp_slots: [{ instrument_id: "other", proficiency_level: 1, approve: true}]
+ }
+ }
+
+ it "succeeds with no data" do
+ get :session_index, format:'json', affiliate_id: partner1.id
+ response.status.should eq(200)
+ body = JSON.parse(response.body)
+ body.length.should eq(0)
+ end
+
+
+ it "succeeds with one scheduled session" do
+ session = MusicSession.create(user_partner1, open_params)
+ get :session_index, format:'json', affiliate_id: partner1.id
+ response.status.should eq(200)
+ body = JSON.parse(response.body)
+ body.length.should eq(1)
+ end
+ end
+
+ describe "recording_index" do
+
+ it "succeeds with no data" do
+ get :recording_index, format:'json', affiliate_id: partner1.id
+ response.status.should eq(200)
+ body = JSON.parse(response.body)
+ body.length.should eq(0)
+ end
+
+ it "succeeds with one recording" do
+ claimed_recording1 = FactoryGirl.create(:claimed_recording, user: user_partner1)
+ puts claimed_recording1.inspect
+ get :recording_index, format:'json', affiliate_id: partner1.id
+ response.status.should eq(200)
+ body = JSON.parse(response.body)
+ body.length.should eq(1)
+ end
+ end
+
+end
diff --git a/web/spec/factories.rb b/web/spec/factories.rb
index 6a87332bd..5b8153f3f 100644
--- a/web/spec/factories.rb
+++ b/web/spec/factories.rb
@@ -777,4 +777,37 @@ FactoryGirl.define do
transaction_type JamRuby::RecurlyTransactionWebHook::FAILED_PAYMENT
end
end
+
+ factory :affiliate_partner, class: 'JamRuby::AffiliatePartner' do
+ sequence(:partner_name) { |n| "partner-#{n}" }
+ entity_type 'Individual'
+ signed_at Time.now
+ association :partner_user, factory: :user
+ end
+
+ factory :affiliate_quarterly_payment, class: 'JamRuby::AffiliateQuarterlyPayment' do
+ year 2015
+ quarter 0
+ association :affiliate_partner, factory: :affiliate_partner
+ end
+
+ factory :affiliate_monthly_payment, class: 'JamRuby::AffiliateMonthlyPayment' do
+ year 2015
+ month 1
+ association :affiliate_partner, factory: :affiliate_partner
+ end
+
+ factory :affiliate_referral_visit, class: 'JamRuby::AffiliateReferralVisit' do
+ ip_address '1.1.1.1'
+ association :affiliate_partner, factory: :affiliate_partner
+ end
+
+ factory :affiliate_traffic_total, class: 'JamRuby::AffiliateTrafficTotal' do
+ day Date.today
+ association :affiliate_partner, factory: :affiliate_partner
+ end
+
+ factory :affiliate_legalese, class: 'JamRuby::AffiliateLegalese' do
+ legalese Faker::Lorem.paragraphs(6).join("\n\n")
+ end
end
diff --git a/web/spec/features/account_affiliate_spec.rb b/web/spec/features/account_affiliate_spec.rb
new file mode 100644
index 000000000..9747a373b
--- /dev/null
+++ b/web/spec/features/account_affiliate_spec.rb
@@ -0,0 +1,152 @@
+require 'spec_helper'
+
+describe "Account Affiliate", :js => true, :type => :feature, :capybara_feature => true do
+
+ subject { page }
+
+ let(:user) {FactoryGirl.create(:user)}
+ let(:partner) { FactoryGirl.create(:affiliate_partner) }
+ let(:jam_track) {FactoryGirl.create(:jam_track)}
+
+ before(:each) do
+ JamTrackRight.delete_all
+ JamTrack.delete_all
+ AffiliateQuarterlyPayment.delete_all
+ AffiliateMonthlyPayment.delete_all
+ AffiliateTrafficTotal.delete_all
+ UserMailer.deliveries.clear
+ emulate_client
+ end
+
+ describe "account overview" do
+ it "shows correct values for partner" do
+ partner.referral_user_count = 3
+ partner.cumulative_earnings_in_cents = 10000
+ partner.save!
+
+ sign_in_poltergeist partner.partner_user
+ visit "/client#/account"
+ find('.account-mid.affiliate .user-referrals', text: 'You have referred 3 users to date.')
+ find('.account-mid.affiliate .affiliate-earnings', text: 'You have earned $100.00 to date.')
+ end
+
+ it "shows correct values for unaffiliated user" do
+ sign_in_poltergeist user
+ visit "/client#/account"
+ find('.account-mid.affiliate .not-affiliated', text: 'You are not currently a JamKazam affiliate.')
+ find('.account-mid.affiliate .learn-affiliate')
+ end
+ end
+
+ describe "account affiliate page" do
+ before(:each) do
+ sign_in_poltergeist partner.partner_user
+ end
+
+ it "works on no data" do
+ jam_track.touch
+
+ visit "/client#/account/affiliatePartner"
+ find('.tab-account', text: 'So please provide this data, and be sure to keep it current!')
+
+ # take a look at the links tab
+ find('a#affiliate-partner-links-link').trigger(:click)
+
+ find('#account-affiliate-partner tr td.target')
+
+ # can't find this on the page for some reason:
+ #jk_select('Custom Link', '#account-affiliate-partner select.link_type')
+ #find('.link-type-prompt[data-type="custom_links"]')
+
+ find('a#affiliate-partner-signups-link').trigger(:click)
+ find('table.traffic-table')
+
+ find('a#affiliate-partner-earnings-link').trigger(:click)
+ find('table.payment-table')
+
+ find('a#affiliate-partner-agreement-link').trigger(:click)
+ find('h2', text: 'JamKazam Affiliate Agreement')
+ find('span.c0', text: 'Updated: April 30, 2015')
+ end
+
+ it "shows data" do
+ visit "/client#/account/affiliatePartner"
+ find('.tab-account', text: 'So please provide this data, and be sure to keep it current!')
+
+ # verify traffic data shows correctly
+ day1 = Date.parse('2015-04-05')
+ FactoryGirl.create(:affiliate_traffic_total, affiliate_partner: partner, day: day1, signups: 1, visits:2)
+
+ find('a#affiliate-partner-signups-link').trigger(:click)
+ find('table.traffic-table tr td.day', text: "April 5")
+ find('table.traffic-table tr td.signups', text: '1')
+ find('table.traffic-table tr td.visits', text: '2')
+
+
+ find('a#affiliate-partner-earnings-link').trigger(:click)
+ find('table.payment-table')
+
+ day2 = Date.parse('2015-04-07')
+ FactoryGirl.create(:affiliate_traffic_total, affiliate_partner: partner, day: day2, signups: 3, visits:4)
+ find('a#affiliate-partner-signups-link').trigger(:click)
+ find('table.traffic-table tr td.day', text: "April 7")
+ find('table.traffic-table tr td.signups', text: '3')
+ find('table.traffic-table tr td.visits', text: '4')
+
+ # verify earnings data correctly
+ FactoryGirl.create(:affiliate_monthly_payment, affiliate_partner:partner, year:2015, month:1, due_amount_in_cents:20, jamtracks_sold: 1, closed:true)
+
+ find('a#affiliate-partner-earnings-link').trigger(:click)
+ find('table.payment-table tr td.month', text: "January 2015")
+ find('table.payment-table tr td.sales', text: 'JamTracks: 1 unit sold')
+ find('table.payment-table tr td.earnings', text: '$0.20')
+
+
+ find('a#affiliate-partner-signups-link').trigger(:click)
+ find('table.traffic-table')
+
+ FactoryGirl.create(:affiliate_monthly_payment, affiliate_partner:partner, year:2015, month:2, due_amount_in_cents:40, jamtracks_sold: 2, closed:true)
+ FactoryGirl.create(:affiliate_monthly_payment, affiliate_partner:partner, year:2015, month:3, due_amount_in_cents:60, jamtracks_sold: 3, closed:true)
+ quarter1 = FactoryGirl.create(:affiliate_quarterly_payment, affiliate_partner:partner, year:2015, quarter:0, due_amount_in_cents:120, jamtracks_sold: 6, closed:true, paid:false)
+ FactoryGirl.create(:affiliate_monthly_payment, affiliate_partner:partner, year:2015, month:4, due_amount_in_cents:2000, jamtracks_sold: 100, closed:true)
+
+ find('a#affiliate-partner-earnings-link').trigger(:click)
+ find('table.payment-table tr td.month', text: "January 2015")
+ find('table.payment-table tr td.sales', text: 'JamTracks: 1 unit sold')
+ find('table.payment-table tr td.earnings', text: '$0.20')
+ find('table.payment-table tr td.month', text: "February 2015")
+ find('table.payment-table tr td.sales', text: 'JamTracks: 2 units sold')
+ find('table.payment-table tr td.earnings', text: '$0.40')
+ find('table.payment-table tr td.month', text: "March 2015")
+ find('table.payment-table tr td.sales', text: 'JamTracks: 3 units sold')
+ find('table.payment-table tr td.earnings', text: '$0.60')
+ find('table.payment-table tr td.month', text: "1st Quarter 2015")
+ find('table.payment-table tr td.earnings', text: 'No earning were paid, as the $10 minimum threshold was not reached.')
+
+
+
+ find('a#affiliate-partner-signups-link').trigger(:click)
+ find('table.traffic-table')
+
+ quarter1.paid = true
+ quarter1.save!
+ FactoryGirl.create(:affiliate_quarterly_payment, affiliate_partner:partner, year:2015, quarter:1, due_amount_in_cents:2000, jamtracks_sold: 100, closed:true, paid:true)
+
+ find('a#affiliate-partner-earnings-link').trigger(:click)
+ find('table.payment-table tr td.month', text: "January 2015")
+ find('table.payment-table tr td.sales', text: 'JamTracks: 1 unit sold')
+ find('table.payment-table tr td.earnings', text: '$0.20')
+ find('table.payment-table tr td.month', text: "February 2015")
+ find('table.payment-table tr td.sales', text: 'JamTracks: 2 units sold')
+ find('table.payment-table tr td.earnings', text: '$0.40')
+ find('table.payment-table tr td.month', text: "March 2015")
+ find('table.payment-table tr td.sales', text: 'JamTracks: 3 units sold')
+ find('table.payment-table tr td.earnings', text: '$0.60')
+
+ find('table.payment-table tr td.month', text: "1st Quarter 2015")
+ find('table.payment-table tr td.earnings', text: 'PAID $1.20')
+ find('table.payment-table tr td.month', text: "2nd Quarter 2015")
+ find('table.payment-table tr td.earnings', text: 'PAID $20.00')
+ end
+ end
+end
diff --git a/web/spec/features/affiliate_program_spec.rb b/web/spec/features/affiliate_program_spec.rb
new file mode 100644
index 000000000..26378cd92
--- /dev/null
+++ b/web/spec/features/affiliate_program_spec.rb
@@ -0,0 +1,90 @@
+require 'spec_helper'
+
+describe "Affiliate Program", :js => true, :type => :feature, :capybara_feature => true do
+
+ subject { page }
+
+ let(:user) { FactoryGirl.create(:user) }
+
+ before(:each) do
+ User.delete_all
+ AffiliateQuarterlyPayment.delete_all
+ AffiliateMonthlyPayment.delete_all
+ AffiliateTrafficTotal.delete_all
+ AffiliatePartner.delete_all
+ end
+
+ before(:all) do
+ @old_recaptcha=Rails.application.config.recaptcha_enable
+ Rails.application.config.recaptcha_enable=false
+ end
+
+ after(:all) do
+ Rails.application.config.recaptcha_enable=@old_recaptcha
+ end
+
+ describe "Affiliate Program signup page" do
+ it "logged in user creates affiliate" do
+ fast_signin user, '/affiliateProgram'
+
+ find('input#entity_individual').trigger(:click)
+
+ find('.agree-button').trigger(:click)
+
+ find('h1', text: 'congratulations')
+ find('.button-orange', text: 'GO TO AFFILIATE PAGE').trigger(:click)
+
+ find('.tab-account', text: 'So please provide this data, and be sure to keep it current!')
+
+ partner = AffiliatePartner.first
+ partner.partner_user.should eq(user)
+ partner.entity_type.should eq('Individual')
+ end
+
+ it "logged in user creates entity affiliate" do
+ fast_signin user, '/affiliateProgram'
+
+ find('input#entity_entity').trigger(:click)
+ fill_in('entity-name', with: 'Mr. Bubbles')
+ select('Sole Proprietor', from:'entity-type')
+
+ find('.agree-button').trigger(:click)
+
+ find('h1', text: 'congratulations')
+ find('.button-orange', text: 'GO TO AFFILIATE PAGE').trigger(:click)
+
+ find('.tab-account', text: 'So please provide this data, and be sure to keep it current!')
+
+ partner = AffiliatePartner.first
+ partner.partner_user.should eq(user)
+ partner.entity_type.should eq('Sole Proprietor')
+ end
+
+ it "new user creates individual affiliate" do
+ visit '/affiliateProgram'
+
+ find('input#entity_individual').trigger(:click)
+
+ find('.agree-button').trigger(:click)
+
+ find('h1', text: 'congratulations')
+ find('.button-orange', text: 'GO SIGNUP').trigger(:click)
+
+ fill_in "jam_ruby_user[first_name]", with: "Affiliate1"
+ fill_in "jam_ruby_user[last_name]", with: "Someone"
+ fill_in "jam_ruby_user[email]", with: "affiliate1@jamkazam.com"
+ fill_in "jam_ruby_user[password]", with: "jam123"
+ fill_in "jam_ruby_user[password_confirmation]", with: "jam123"
+ check("jam_ruby_user[instruments][drums][selected]")
+ check("jam_ruby_user[terms_of_service]")
+ click_button "CREATE ACCOUNT"
+
+ should have_title("JamKazam | Congratulations")
+
+ found_user = User.first
+ partner = AffiliatePartner.first
+ partner.partner_user.should eq(found_user)
+ partner.entity_type.should eq('Individual')
+ end
+ end
+end
diff --git a/web/spec/features/affiliate_referral_spec.rb b/web/spec/features/affiliate_referral_spec.rb
new file mode 100644
index 000000000..ed4f24f49
--- /dev/null
+++ b/web/spec/features/affiliate_referral_spec.rb
@@ -0,0 +1,59 @@
+require 'spec_helper'
+
+describe "affiliate visit tracking", :js => true, :type => :feature, :capybara_feature => true do
+
+ subject { page }
+
+ let(:user) { FactoryGirl.create(:user) }
+ let(:partner) { FactoryGirl.create(:affiliate_partner) }
+ let(:affiliate_params) { partner.affiliate_query_params }
+
+ before(:each) do
+ AffiliateTrafficTotal.delete_all
+ AffiliateReferralVisit.delete_all
+ end
+
+ before(:all) do
+ @old_recaptcha=Rails.application.config.recaptcha_enable
+ Rails.application.config.recaptcha_enable=false
+ end
+
+ after(:all) do
+ Rails.application.config.recaptcha_enable=@old_recaptcha
+ end
+
+ # the ways that a user might signup:
+ # on free jamtrack redemption flow - this is verified in checkout_spec.rb
+ # via facebook
+ # /signup
+ it "verifies that a signup via /signup page, when coming from a referral, attributes partner" do
+ visit '/?' + affiliate_params
+
+ should_be_at_root
+ AffiliateReferralVisit.count.should eq(1)
+
+ visit '/signup'
+ fill_in "jam_ruby_user[first_name]", with: "Affiliate"
+ fill_in "jam_ruby_user[last_name]", with: "Referral"
+ fill_in "jam_ruby_user[email]", with: "referral1@jamkazam.com"
+ fill_in "jam_ruby_user[password]", with: "jam123"
+ fill_in "jam_ruby_user[password_confirmation]", with: "jam123"
+ check("jam_ruby_user[instruments][drums][selected]")
+ check("jam_ruby_user[terms_of_service]")
+ click_button "CREATE ACCOUNT"
+
+ should have_title("JamKazam | Congratulations")
+
+ referral = User.find_by_email('referral1@jamkazam.com')
+ referral.affiliate_referral.should eq(partner)
+ AffiliatePartner.tally_up(referral.created_at.to_date + 1)
+
+ partner.reload
+ partner.referral_user_count.should eq(1)
+
+ total = AffiliateTrafficTotal.first
+ total.signups.should eq(1)
+ end
+
+
+end
diff --git a/web/spec/features/affiliate_visit_tracking.rb b/web/spec/features/affiliate_visit_tracking.rb
new file mode 100644
index 000000000..09ee9dcd5
--- /dev/null
+++ b/web/spec/features/affiliate_visit_tracking.rb
@@ -0,0 +1,36 @@
+require 'spec_helper'
+
+describe "affiliate visit tracking" do
+
+ subject { page }
+
+ let(:user) { FactoryGirl.create(:user) }
+ let(:partner) { FactoryGirl.create(:affiliate_partner) }
+ let(:affiliate_params) { partner.affiliate_query_params }
+
+ before(:each) do
+ AffiliateReferralVisit.delete_all
+ end
+
+ it "tracks" do
+ visit '/?' + affiliate_params
+
+ should_be_at_root
+ AffiliateReferralVisit.count.should eq(1)
+ visit = AffiliateReferralVisit.first
+ visit.visited_url.should eq('/?' + affiliate_params)
+ visit.affiliate_partner_id.should eq(partner.id)
+ visit.first_visit.should be_true
+
+ download_url = '/downloads?' + affiliate_params
+ visit download_url
+ find('h2.create-account-header')
+
+
+ AffiliateReferralVisit.count.should eq(2)
+ visit = AffiliateReferralVisit.find_by_visited_url(download_url)
+ visit.affiliate_partner_id.should eq(partner.id)
+ visit.first_visit.should be_false
+ end
+
+end
diff --git a/web/spec/features/checkout_spec.rb b/web/spec/features/checkout_spec.rb
index d0a3a9b0c..bebe03a02 100644
--- a/web/spec/features/checkout_spec.rb
+++ b/web/spec/features/checkout_spec.rb
@@ -827,6 +827,123 @@ describe "Checkout", :js => true, :type => :feature, :capybara_feature => true d
end
+ it "for anonymous user with referral" do
+
+ partner = FactoryGirl.create(:affiliate_partner)
+ affiliate_params = partner.affiliate_query_params
+
+ visit '/landing/jamtracks/acdc-backinblack?' + affiliate_params
+ find('a.browse-jamtracks').trigger(:click)
+
+ find('h1', text: 'jamtracks')
+ #find('a', text: 'What is a JamTrack?')
+
+ find("a.jamtrack-add-cart[data-jamtrack-id=\"#{jamtrack_acdc_backinblack.id}\"]", text: 'GET IT FREE!').trigger(:click)
+ find('h3', text: 'OR SIGN UP USING YOUR EMAIL')
+ shopping_carts = ShoppingCart.all
+ shopping_carts.count.should eq(1)
+ shopping_cart = shopping_carts[0]
+ shopping_cart.anonymous_user_id.should_not be_nil
+ shopping_cart.user_id.should be_nil
+
+ fill_in 'first_name', with: 'Seth'
+ fill_in 'last_name', with: 'Call'
+ fill_in 'email', with: 'guy_referral@jamkazam.com'
+ fill_in 'password', with: 'jam123'
+ find('.right-side .terms_of_service input').trigger(:click) # accept TOS
+
+ # try to submit, and see order page
+ find('.signup-submit').trigger(:click)
+
+ find('.jam-tracks-in-browser')
+
+ guy = User.find_by_email('guy_referral@jamkazam.com')
+ guy.affiliate_referral.should eq(partner)
+ guy.reload
+
+ # verify sales data
+ guy.sales.length.should eq(1)
+ sale = guy.sales.first
+ sale.sale_line_items.length.should eq(1)
+ acdc_sale = sale.sale_line_items[0]
+ acdc_sale.affiliate_referral.should eq(partner)
+ acdc_sale.affiliate_refunded.should be_false
+ acdc_sale.affiliate_refunded_at.should be_nil
+ acdc_sale.affiliate_referral_fee_in_cents.should eq(0)
+
+ # this is a little cheat to make the billing info dropdown already say US
+ guy.country = 'US'
+ guy.save!
+
+ # now, go back to checkout flow again, and make sure we are told there are no free jam tracks
+
+ visit "/client#/jamtrackBrowse"
+
+ find("a.jamtrack-add-cart[data-jamtrack-id=\"#{jamtrack_pearljam_evenflow.id}\"]", text: 'ADD TO CART').trigger(:click)
+ find('h1', text: 'shopping cart')
+ find('.cart-item-caption', text: "JamTrack: #{jamtrack_pearljam_evenflow.name}")
+ find('.cart-item-price', text: "$ #{jamtrack_pearljam_evenflow.price}")
+ find('.shopping-sub-total', text:"Subtotal:$ #{jamtrack_pearljam_evenflow.price}")
+
+ # attempt to checkout
+ find('a.button-orange', text: 'PROCEED TO CHECKOUT').trigger(:click)
+
+ # should be at payment page
+
+ # this should take us to the payment screen
+ find('p.payment-prompt')
+
+ # fill out all billing info and account info
+ fill_in 'billing-first-name', with: 'Seth'
+ fill_in 'billing-last-name', with: 'Call'
+ fill_in 'billing-address1', with: '10704 Buckthorn Drive'
+ fill_in 'billing-city', with: 'Austin'
+ fill_in 'billing-state', with: 'Texas'
+ fill_in 'billing-zip', with: '78759'
+ fill_in 'card-number', with: '4111111111111111'
+ fill_in 'card-verify', with: '012'
+ #jk_select('US', '#checkoutPaymentScreen #divBillingCountry #billing-country')
+
+ find('#payment-info-next').trigger(:click)
+
+ # should be taken straight to order page
+
+ # now see order page, and everything should no longer appear free
+ find('p.order-prompt')
+ find('.order-items-value.order-total', text:'$1.99')
+ find('.order-items-value.shipping-handling', text:'$0.00')
+ find('.order-items-value.sub-total', text:'$1.99')
+ find('.order-items-value.taxes', text:'$0.16')
+ find('.order-items-value.grand-total', text:'$2.15')
+
+ # click the ORDER button
+ find('.place-order-center a.button-orange.place-order').trigger(:click)
+
+ # and now we should see confirmation, and a notice that we are in a normal browser
+ find('.thanks-detail.jam-tracks-in-browser')
+
+ guy.reload
+
+ sleep 3 # challenge to all comers! WHY DO I HAVE TO SLEEP FOR THIS ASSERTION TO BE TRUE! GAH . and 1 second won't do it
+
+ jam_track_right = jamtrack_pearljam_evenflow.right_for_user(guy)
+ # make sure it appears the user actually bought the jamtrack!
+ jam_track_right.should_not be_nil
+ jam_track_right.redeemed.should be_false
+ guy.has_redeemable_jamtrack.should be_false
+
+ # verify sales data
+ guy.sales.length.should eq(2)
+ sale = guy.sales.last
+ sale.sale_line_items.length.should eq(1)
+ acdc_sale = SaleLineItem.find_by_recurly_adjustment_uuid(jam_track_right.recurly_adjustment_uuid)
+ acdc_sale.affiliate_referral.should eq(partner)
+ acdc_sale.affiliate_refunded.should be_false
+ acdc_sale.affiliate_refunded_at.should be_nil
+ acdc_sale.affiliate_referral_fee_in_cents.should eq(20)
+
+ end
+
it "for existing user with a freebie available (already logged in)" do
diff --git a/web/spec/managers/user_manager_spec.rb b/web/spec/managers/user_manager_spec.rb
index 275d90b69..f6d464226 100644
--- a/web/spec/managers/user_manager_spec.rb
+++ b/web/spec/managers/user_manager_spec.rb
@@ -182,9 +182,7 @@ describe UserManager do
describe "signup" do
let!(:user) { FactoryGirl.create(:user) }
let!(:partner) {
- AffiliatePartner.create_with_params({:partner_name => Faker::Company.name,
- :partner_code => Faker::Lorem.words(1)[0],
- :user_email => user.email})
+ AffiliatePartner.create_with_web_params(user, {:partner_name => Faker::Company.name, entity_type:'Individual'})
}
it "signup successfully" do
@@ -200,7 +198,7 @@ describe UserManager do
instruments: @instruments,
musician:true,
signup_confirm_url: "http://localhost:3000/confirm",
- affiliate_referral_id: AffiliatePartner.coded_id(partner.partner_code))
+ affiliate_referral_id: partner.id)
user.errors.any?.should be_false
user.first_name.should == "bob"
diff --git a/web/spec/requests/affilate_referral_spec.rb b/web/spec/requests/affilate_referral_spec.rb
index 7a61f8ec4..c3d0f457d 100644
--- a/web/spec/requests/affilate_referral_spec.rb
+++ b/web/spec/requests/affilate_referral_spec.rb
@@ -6,9 +6,7 @@ describe "Affiliate Reports", :type => :api do
let!(:user) { FactoryGirl.create(:user) }
let!(:partner) {
- AffiliatePartner.create_with_params({:partner_name => Faker::Company.name,
- :partner_code => Faker::Lorem.words[0],
- :user_email => user.email})
+ AffiliatePartner.create_with_web_params(user, {:partner_name => Faker::Company.name, entity_type:'Individual'})
}
it "valid score" do
diff --git a/web/spec/support/app_config.rb b/web/spec/support/app_config.rb
index b7cc08d89..6ee586981 100644
--- a/web/spec/support/app_config.rb
+++ b/web/spec/support/app_config.rb
@@ -94,6 +94,14 @@ def web_config
def secret_token
'ced345e01611593c1b783bae98e4e56dbaee787747e92a141565f7c61d0ab2c6f98f7396fb4b178258301e2713816e158461af58c14b695901692f91e72b6200'
end
+
+ def expire_fingerprint_days
+ 14
+ end
+
+ def found_conflict_count
+ 1
+ end
end
klass.new
end
diff --git a/web/spec/support/remote_ip_monkey_patch.rb b/web/spec/support/remote_ip_monkey_patch.rb
new file mode 100644
index 000000000..7d725d072
--- /dev/null
+++ b/web/spec/support/remote_ip_monkey_patch.rb
@@ -0,0 +1,17 @@
+module ActionDispatch
+ class Request
+
+ def remote_ip_with_mocking
+ test_ip = ENV['RAILS_TEST_IP_ADDRESS']
+
+ unless test_ip.nil? or test_ip.empty?
+ return test_ip
+ else
+ return remote_ip_without_mocking
+ end
+ end
+
+ alias_method_chain :remote_ip, :mocking
+
+ end
+end
\ No newline at end of file
diff --git a/web/spec/support/utilities.rb b/web/spec/support/utilities.rb
index 85274ad79..83a285a2e 100644
--- a/web/spec/support/utilities.rb
+++ b/web/spec/support/utilities.rb
@@ -225,7 +225,7 @@ def should_be_at_root(options={signed_in:nil})
find('h1', text: 'Live music platform & social network for musicians')
end
when Capybara::RackTest::Driver
- signed_in = false # actually, the user may be signed in, but, we only redirect to /client in javascript, so RackTest won't do that
+ signed_in = !cookie_jar['remember_token'].nil?
if signed_in
find('h2', text: 'create session')
else
diff --git a/web/vendor/assets/javascripts/bugsnag.js b/web/vendor/assets/javascripts/bugsnag.js
new file mode 100644
index 000000000..0bdefaadb
--- /dev/null
+++ b/web/vendor/assets/javascripts/bugsnag.js
@@ -0,0 +1,10 @@
+// 2.4.8 http://d2wy8f7a9ursnm.cloudfront.net/bugsnag-2.4.8.min.js
+
+
+// START COPY/PASTE FROM BUGSNAG CDN
+!function(a,b){function c(a,b){try{if("function"!=typeof a)return a;if(!a.bugsnag){var c=e();a.bugsnag=function(d){if(b&&b.eventHandler&&(u=d),v=c,!y){var e=a.apply(this,arguments);return v=null,e}try{return a.apply(this,arguments)}catch(f){throw l("autoNotify",!0)&&(x.notifyException(f,null,null,"error"),s()),f}finally{v=null}},a.bugsnag.bugsnag=a.bugsnag}return a.bugsnag}catch(d){return a}}function d(){B=!1}function e(){var a=document.currentScript||v;if(!a&&B){var b=document.scripts||document.getElementsByTagName("script");a=b[b.length-1]}return a}function f(a){var b=e();b&&(a.script={src:b.src,content:l("inlineScript",!0)?b.innerHTML:""})}function g(b){var c=l("disableLog"),d=a.console;void 0===d||void 0===d.log||c||d.log("[Bugsnag] "+b)}function h(b,c,d){if(d>=5)return encodeURIComponent(c)+"=[RECURSIVE]";d=d+1||1;try{if(a.Node&&b instanceof a.Node)return encodeURIComponent(c)+"="+encodeURIComponent(r(b));var e=[];for(var f in b)if(b.hasOwnProperty(f)&&null!=f&&null!=b[f]){var g=c?c+"["+f+"]":f,i=b[f];e.push("object"==typeof i?h(i,g,d):encodeURIComponent(g)+"="+encodeURIComponent(i))}return e.join("&")}catch(j){return encodeURIComponent(c)+"="+encodeURIComponent(""+j)}}function i(a,b){if(null==b)return a;a=a||{};for(var c in b)if(b.hasOwnProperty(c))try{a[c]=b[c].constructor===Object?i(a[c],b[c]):b[c]}catch(d){a[c]=b[c]}return a}function j(a,b){a+="?"+h(b)+"&ct=img&cb="+(new Date).getTime();var c=new Image;c.src=a}function k(a){var b={},c=/^data\-([\w\-]+)$/;if(a)for(var d=a.attributes,e=0;e\n",b=p(e)}if(!b){a="\n";var f=[];try{for(var h=arguments.callee.caller.caller;h&&f.length"}return a.nodeName}}function s(){z+=1,a.setTimeout(function(){z-=1})}function t(a,b,c){var d=a[b],e=c(d);a[b]=e}var u,v,w,x={},y=!0,z=0,A=10;x.noConflict=function(){return a.Bugsnag=b,x},x.refresh=function(){A=10},x.notifyException=function(a,b,c,d){b&&"string"!=typeof b&&(c=b,b=void 0),c||(c={}),f(c),n({name:b||a.name,message:a.message||a.description,stacktrace:p(a)||o(),file:a.fileName||a.sourceURL,lineNumber:a.lineNumber||a.line,columnNumber:a.columnNumber?a.columnNumber+1:void 0,severity:d||"warning"},c)},x.notify=function(b,c,d,e){n({name:b,message:c,stacktrace:o(),file:a.location.toString(),lineNumber:1,severity:e||"warning"},d)};var B="complete"!==document.readyState;document.addEventListener?(document.addEventListener("DOMContentLoaded",d,!0),a.addEventListener("load",d,!0)):a.attachEvent("onload",d);var C,D=/^[0-9a-f]{32}$/i,E=/function\s*([\w\-$]+)?\s*\(/i,F="https://notify.bugsnag.com/",G=F+"js",H="2.4.8",I=document.getElementsByTagName("script"),J=I[I.length-1];if(a.atob){if(a.ErrorEvent)try{0===new a.ErrorEvent("test").colno&&(y=!1)}catch(K){}}else y=!1;if(l("autoNotify",!0)){t(a,"onerror",function(b){return function(c,d,e,g,h){var i=l("autoNotify",!0),j={};!g&&a.event&&(g=a.event.errorCharacter),f(j),v=null,i&&!z&&n({name:h&&h.name||"window.onerror",message:c,file:d,lineNumber:e,columnNumber:g,stacktrace:h&&p(h)||o(),severity:"error"},j),b&&b(c,d,e,g,h)}});var L=function(a){return function(b,d){if("function"==typeof b){b=c(b);var e=Array.prototype.slice.call(arguments,2);return a(function(){b.apply(this,e)},d)}return a(b,d)}};t(a,"setTimeout",L),t(a,"setInterval",L),a.requestAnimationFrame&&t(a,"requestAnimationFrame",function(a){return function(b){return a(c(b))}}),a.setImmediate&&t(a,"setImmediate",function(a){return function(){var b=Array.prototype.slice.call(arguments);return b[0]=c(b[0]),a.apply(this,b)}}),"EventTarget Window Node ApplicationCache AudioTrackList ChannelMergerNode CryptoOperation EventSource FileReader HTMLUnknownElement IDBDatabase IDBRequest IDBTransaction KeyOperation MediaController MessagePort ModalWindow Notification SVGElementInstance Screen TextTrack TextTrackCue TextTrackList WebSocket WebSocketWorker Worker XMLHttpRequest XMLHttpRequestEventTarget XMLHttpRequestUpload".replace(/\w+/g,function(b){var d=a[b]&&a[b].prototype;d&&d.hasOwnProperty&&d.hasOwnProperty("addEventListener")&&(t(d,"addEventListener",function(a){return function(b,d,e,f){try{d&&d.handleEvent&&(d.handleEvent=c(d.handleEvent,{eventHandler:!0}))}catch(h){g(h)}return a.call(this,b,c(d,{eventHandler:!0}),e,f)}}),t(d,"removeEventListener",function(a){return function(b,d,e,f){return a.call(this,b,d,e,f),a.call(this,b,c(d),e,f)}}))})}a.Bugsnag=x,"function"==typeof define&&define.amd?define([],function(){return x}):"object"==typeof module&&"object"==typeof module.exports&&(module.exports=x)}(window,window.Bugsnag);
+// END COPY/PASTE FROM BUGSNAG CDN
+
+
+// manual code: make sure Bugsnag has it's API KEY
+window.Bugsnag.apiKey = gon.global.bugsnag_key
\ No newline at end of file
diff --git a/web/vendor/assets/javascripts/jquery.visible.js b/web/vendor/assets/javascripts/jquery.visible.js
new file mode 100644
index 000000000..1e340099b
--- /dev/null
+++ b/web/vendor/assets/javascripts/jquery.visible.js
@@ -0,0 +1,68 @@
+(function($){
+
+ /**
+ * Copyright 2012, Digital Fusion
+ * Licensed under the MIT license.
+ * http://teamdf.com/jquery-plugins/license/
+ *
+ * @author Sam Sehnert
+ * @desc A small plugin that checks whether elements are within
+ * the user visible viewport of a web browser.
+ * only accounts for vertical position, not horizontal.
+ */
+ var $w = $(window);
+ $.fn.visible = function(partial,hidden,direction){
+
+ if (this.length < 1)
+ return;
+
+ var $t = this.length > 1 ? this.eq(0) : this,
+ t = $t.get(0),
+ vpWidth = $w.width(),
+ vpHeight = $w.height(),
+ direction = (direction) ? direction : 'both',
+ clientSize = hidden === true ? t.offsetWidth * t.offsetHeight : true;
+
+ if (typeof t.getBoundingClientRect === 'function'){
+
+ // Use this native browser method, if available.
+ var rec = t.getBoundingClientRect(),
+ tViz = rec.top >= 0 && rec.top < vpHeight,
+ bViz = rec.bottom > 0 && rec.bottom <= vpHeight,
+ lViz = rec.left >= 0 && rec.left < vpWidth,
+ rViz = rec.right > 0 && rec.right <= vpWidth,
+ vVisible = partial ? tViz || bViz : tViz && bViz,
+ hVisible = partial ? lViz || rViz : lViz && rViz;
+
+ if(direction === 'both')
+ return clientSize && vVisible && hVisible;
+ else if(direction === 'vertical')
+ return clientSize && vVisible;
+ else if(direction === 'horizontal')
+ return clientSize && hVisible;
+ } else {
+
+ var viewTop = $w.scrollTop(),
+ viewBottom = viewTop + vpHeight,
+ viewLeft = $w.scrollLeft(),
+ viewRight = viewLeft + vpWidth,
+ offset = $t.offset(),
+ _top = offset.top,
+ _bottom = _top + $t.height(),
+ _left = offset.left,
+ _right = _left + $t.width(),
+ compareTop = partial === true ? _bottom : _top,
+ compareBottom = partial === true ? _top : _bottom,
+ compareLeft = partial === true ? _right : _left,
+ compareRight = partial === true ? _left : _right;
+
+ if(direction === 'both')
+ return !!clientSize && ((compareBottom <= viewBottom) && (compareTop >= viewTop)) && ((compareRight <= viewRight) && (compareLeft >= viewLeft));
+ else if(direction === 'vertical')
+ return !!clientSize && ((compareBottom <= viewBottom) && (compareTop >= viewTop));
+ else if(direction === 'horizontal')
+ return !!clientSize && ((compareRight <= viewRight) && (compareLeft >= viewLeft));
+ }
+ };
+
+})(jQuery);
\ No newline at end of file