").append(x.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},x.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){x.fn[t]=function(e){return this.on(t,e)}}),x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:"GET",isLocal:Cn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":x.parseJSON,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?_n(_n(e,x.ajaxSettings),t):_n(x.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){"object"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,l,u,c,p=x.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?x(f):x.event,h=x.Deferred(),g=x.Callbacks("once memory"),m=p.statusCode||{},y={},v={},b=0,w="canceled",C={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!c){c={};while(t=Tn.exec(a))c[t[1].toLowerCase()]=t[2]}t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return b||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>b)for(t in e)m[t]=[m[t],e[t]];else C.always(e[C.status]);return this},abort:function(e){var t=e||w;return u&&u.abort(t),k(0,t),this}};if(h.promise(C).complete=g.add,C.success=C.done,C.error=C.fail,p.url=((e||p.url||yn)+"").replace(xn,"").replace(kn,mn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=x.trim(p.dataType||"*").toLowerCase().match(T)||[""],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||("http:"===r[1]?"80":"443"))===(mn[3]||("http:"===mn[1]?"80":"443")))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=x.param(p.data,p.traditional)),qn(An,p,n,C),2===b)return C;l=p.global,l&&0===x.active++&&x.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Nn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,"$1_="+vn++):o+(bn.test(o)?"&":"?")+"_="+vn++)),p.ifModified&&(x.lastModified[o]&&C.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&C.setRequestHeader("If-None-Match",x.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&C.setRequestHeader("Content-Type",p.contentType),C.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dn+"; q=0.01":""):p.accepts["*"]);for(i in p.headers)C.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,C,p)===!1||2===b))return C.abort();w="abort";for(i in{success:1,error:1,complete:1})C[i](p[i]);if(u=qn(jn,p,n,C)){C.readyState=1,l&&d.trigger("ajaxSend",[C,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){C.abort("timeout")},p.timeout));try{b=1,u.send(y,k)}catch(N){if(!(2>b))throw N;k(-1,N)}}else k(-1,"No Transport");function k(e,n,r,i){var c,y,v,w,T,N=n;2!==b&&(b=2,s&&clearTimeout(s),u=t,a=i||"",C.readyState=e>0?4:0,c=e>=200&&300>e||304===e,r&&(w=Mn(p,C,r)),w=On(p,w,C,c),c?(p.ifModified&&(T=C.getResponseHeader("Last-Modified"),T&&(x.lastModified[o]=T),T=C.getResponseHeader("etag"),T&&(x.etag[o]=T)),204===e||"HEAD"===p.type?N="nocontent":304===e?N="notmodified":(N=w.state,y=w.data,v=w.error,c=!v)):(v=N,(e||!N)&&(N="error",0>e&&(e=0))),C.status=e,C.statusText=(n||N)+"",c?h.resolveWith(f,[y,N,C]):h.rejectWith(f,[C,N,v]),C.statusCode(m),m=t,l&&d.trigger(c?"ajaxSuccess":"ajaxError",[C,p,c?y:v]),g.fireWith(f,[C,N]),l&&(d.trigger("ajaxComplete",[C,p]),--x.active||x.event.trigger("ajaxStop")))}return C},getJSON:function(e,t,n){return x.get(e,t,n,"json")},getScript:function(e,n){return x.get(e,t,n,"script")}}),x.each(["get","post"],function(e,n){x[n]=function(e,r,i,o){return x.isFunction(r)&&(o=o||i,i=r,r=t),x.ajax({url:e,type:n,dataType:o,data:r,success:i})}});function Mn(e,n,r){var i,o,a,s,l=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),o===t&&(o=e.mimeType||n.getResponseHeader("Content-Type"));if(o)for(s in l)if(l[s]&&l[s].test(o)){u.unshift(s);break}if(u[0]in r)a=u[0];else{for(s in r){if(!u[0]||e.converters[s+" "+u[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==u[0]&&u.unshift(a),r[a]):t}function On(e,t,n,r){var i,o,a,s,l,u={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)u[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!l&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),l=o,o=c.shift())if("*"===o)o=l;else if("*"!==l&&l!==o){if(a=u[l+" "+o]||u["* "+o],!a)for(i in u)if(s=i.split(" "),s[1]===o&&(a=u[l+" "+s[0]]||u["* "+s[0]])){a===!0?a=u[i]:u[i]!==!0&&(o=s[0],c.unshift(s[1]));break}if(a!==!0)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(p){return{state:"parsererror",error:a?p:"No conversion from "+l+" to "+o}}}return{state:"success",data:t}}x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return x.globalEval(e),e}}}),x.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),x.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=a.head||x("head")[0]||a.documentElement;return{send:function(t,i){n=a.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var Fn=[],Bn=/(=)\?(?=&|$)|\?\?/;x.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Fn.pop()||x.expando+"_"+vn++;return this[e]=!0,e}}),x.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,l=n.jsonp!==!1&&(Bn.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Bn.test(n.data)&&"data");return l||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=x.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,l?n[l]=n[l].replace(Bn,"$1"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||x.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,Fn.push(o)),s&&x.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}x.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=x.ajaxSettings.xhr(),x.support.cors=!!Rn&&"withCredentials"in Rn,Rn=x.support.ajax=!!Rn,Rn&&x.ajaxTransport(function(n){if(!n.crossDomain||x.support.cors){var r;return{send:function(i,o){var a,s,l=n.xhr();if(n.username?l.open(n.type,n.url,n.async,n.username,n.password):l.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)l[s]=n.xhrFields[s];n.mimeType&&l.overrideMimeType&&l.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)l.setRequestHeader(s,i[s])}catch(u){}l.send(n.hasContent&&n.data||null),r=function(e,i){var s,u,c,p;try{if(r&&(i||4===l.readyState))if(r=t,a&&(l.onreadystatechange=x.noop,$n&&delete Pn[a]),i)4!==l.readyState&&l.abort();else{p={},s=l.status,u=l.getAllResponseHeaders(),"string"==typeof l.responseText&&(p.text=l.responseText);try{c=l.statusText}catch(f){c=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,u)},n.async?4===l.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},x(e).unload($n)),Pn[a]=r),l.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp("^(?:([+-])=|)("+w+")([a-z%]*)$","i"),Jn=/queueHooks$/,Gn=[nr],Qn={"*":[function(e,t){var n=this.createTween(e,t),r=n.cur(),i=Yn.exec(t),o=i&&i[3]||(x.cssNumber[e]?"":"px"),a=(x.cssNumber[e]||"px"!==o&&+r)&&Yn.exec(x.css(n.elem,e)),s=1,l=20;if(a&&a[3]!==o){o=o||a[3],i=i||[],a=+r||1;do s=s||".5",a/=s,x.style(n.elem,e,a+o);while(s!==(s=n.cur()/r)&&1!==s&&--l)}return i&&(a=n.start=+a||+r||0,n.unit=o,n.end=i[1]?a+(i[1]+1)*i[2]:+i[2]),n}]};function Kn(){return setTimeout(function(){Xn=t}),Xn=x.now()}function Zn(e,t,n){var r,i=(Qn[t]||[]).concat(Qn["*"]),o=0,a=i.length;for(;a>o;o++)if(r=i[o].call(n,t,e))return r}function er(e,t,n){var r,i,o=0,a=Gn.length,s=x.Deferred().always(function(){delete l.elem}),l=function(){if(i)return!1;var t=Xn||Kn(),n=Math.max(0,u.startTime+u.duration-t),r=n/u.duration||0,o=1-r,a=0,l=u.tweens.length;for(;l>a;a++)u.tweens[a].run(o);return s.notifyWith(e,[u,o,n]),1>o&&l?n:(s.resolveWith(e,[u]),!1)},u=s.promise({elem:e,props:x.extend({},t),opts:x.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=x.Tween(e,u.opts,t,n,u.opts.specialEasing[t]||u.opts.easing);return u.tweens.push(r),r},stop:function(t){var n=0,r=t?u.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)u.tweens[n].run(1);return t?s.resolveWith(e,[u,t]):s.rejectWith(e,[u,t]),this}}),c=u.props;for(tr(c,u.opts.specialEasing);a>o;o++)if(r=Gn[o].call(u,e,c,u.opts))return r;return x.map(c,Zn,u),x.isFunction(u.opts.start)&&u.opts.start.call(e,u),x.fx.timer(x.extend(l,{elem:e,anim:u,queue:u.opts.queue})),u.progress(u.opts.progress).done(u.opts.done,u.opts.complete).fail(u.opts.fail).always(u.opts.always)}function tr(e,t){var n,r,i,o,a;for(n in e)if(r=x.camelCase(n),i=t[r],o=e[n],x.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),a=x.cssHooks[r],a&&"expand"in a){o=a.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}x.Animation=x.extend(er,{tweener:function(e,t){x.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}});function nr(e,t,n){var r,i,o,a,s,l,u=this,c={},p=e.style,f=e.nodeType&&nn(e),d=x._data(e,"fxshow");n.queue||(s=x._queueHooks(e,"fx"),null==s.unqueued&&(s.unqueued=0,l=s.empty.fire,s.empty.fire=function(){s.unqueued||l()}),s.unqueued++,u.always(function(){u.always(function(){s.unqueued--,x.queue(e,"fx").length||s.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],"inline"===x.css(e,"display")&&"none"===x.css(e,"float")&&(x.support.inlineBlockNeedsLayout&&"inline"!==ln(e.nodeName)?p.zoom=1:p.display="inline-block")),n.overflow&&(p.overflow="hidden",x.support.shrinkWrapBlocks||u.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],Vn.exec(i)){if(delete t[r],o=o||"toggle"===i,i===(f?"hide":"show"))continue;c[r]=d&&d[r]||x.style(e,r)}if(!x.isEmptyObject(c)){d?"hidden"in d&&(f=d.hidden):d=x._data(e,"fxshow",{}),o&&(d.hidden=!f),f?x(e).show():u.done(function(){x(e).hide()}),u.done(function(){var t;x._removeData(e,"fxshow");for(t in c)x.style(e,t,c[t])});for(r in c)a=Zn(f?d[r]:0,r,u),r in d||(d[r]=a.start,f&&(a.end=a.start,a.start="width"===r||"height"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}x.Tween=rr,rr.prototype={constructor:rr,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(x.cssNumber[n]?"":"px")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?x.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=x.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){x.fx.step[e.prop]?x.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[x.cssProps[e.prop]]||x.cssHooks[e.prop])?x.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},x.each(["toggle","show","hide"],function(e,t){var n=x.fn[t];x.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),x.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=x.isEmptyObject(e),o=x.speed(t,n,r),a=function(){var t=er(this,x.extend({},e),o);(i||x._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=x.timers,a=x._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&x.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=x._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=x.timers,a=r?r.length:0;for(n.finish=!0,x.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}x.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){x.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),x.speed=function(e,t,n){var r=e&&"object"==typeof e?x.extend({},e):{complete:n||!n&&t||x.isFunction(e)&&e,duration:e,easing:n&&t||t&&!x.isFunction(t)&&t};return r.duration=x.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in x.fx.speeds?x.fx.speeds[r.duration]:x.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){x.isFunction(r.old)&&r.old.call(this),r.queue&&x.dequeue(this,r.queue)},r},x.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},x.timers=[],x.fx=rr.prototype.init,x.fx.tick=function(){var e,n=x.timers,r=0;for(Xn=x.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||x.fx.stop(),Xn=t},x.fx.timer=function(e){e()&&x.timers.push(e)&&x.fx.start()},x.fx.interval=13,x.fx.start=function(){Un||(Un=setInterval(x.fx.tick,x.fx.interval))},x.fx.stop=function(){clearInterval(Un),Un=null},x.fx.speeds={slow:600,fast:200,_default:400},x.fx.step={},x.expr&&x.expr.filters&&(x.expr.filters.animated=function(e){return x.grep(x.timers,function(t){return e===t.elem}).length}),x.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){x.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,x.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},x.offset={setOffset:function(e,t,n){var r=x.css(e,"position");"static"===r&&(e.style.position="relative");var i=x(e),o=i.offset(),a=x.css(e,"top"),s=x.css(e,"left"),l=("absolute"===r||"fixed"===r)&&x.inArray("auto",[a,s])>-1,u={},c={},p,f;l?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),x.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(u.top=t.top-o.top+p),null!=t.left&&(u.left=t.left-o.left+f),"using"in t?t.using.call(e,u):i.css(u)}},x.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===x.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),x.nodeName(e[0],"html")||(n=e.offset()),n.top+=x.css(e[0],"borderTopWidth",!0),n.left+=x.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-x.css(r,"marginTop",!0),left:t.left-n.left-x.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||s;while(e&&!x.nodeName(e,"html")&&"static"===x.css(e,"position"))e=e.offsetParent;return e||s})}}),x.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);x.fn[e]=function(i){return x.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?x(a).scrollLeft():o,r?o:x(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return x.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}x.each({Height:"height",Width:"width"},function(e,n){x.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){x.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return x.access(this,function(n,r,i){var o;return x.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?x.css(n,r,s):x.style(n,r,i,s)},n,a?i:t,a,null)}})}),x.fn.size=function(){return this.length},x.fn.andSelf=x.fn.addBack,"object"==typeof module&&module&&"object"==typeof module.exports?module.exports=x:(e.jQuery=e.$=x,"function"==typeof define&&define.amd&&define("jquery",[],function(){return x}))})(window);
diff --git a/Fitbit.Portable.DebugSite/Scripts/jquery-1.10.2.min.map b/Fitbit.Portable.DebugSite/Scripts/jquery-1.10.2.min.map
deleted file mode 100644
index 4dc4920b..00000000
--- a/Fitbit.Portable.DebugSite/Scripts/jquery-1.10.2.min.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"jquery-1.10.2.min.js","sources":["jquery-1.10.2.js"],"names":["window","undefined","readyList","rootjQuery","core_strundefined","location","document","docElem","documentElement","_jQuery","jQuery","_$","$","class2type","core_deletedIds","core_version","core_concat","concat","core_push","push","core_slice","slice","core_indexOf","indexOf","core_toString","toString","core_hasOwn","hasOwnProperty","core_trim","trim","selector","context","fn","init","core_pnum","source","core_rnotwhite","rtrim","rquickExpr","rsingleTag","rvalidchars","rvalidbraces","rvalidescape","rvalidtokens","rmsPrefix","rdashAlpha","fcamelCase","all","letter","toUpperCase","completed","event","addEventListener","type","readyState","detach","ready","removeEventListener","detachEvent","prototype","jquery","constructor","match","elem","this","charAt","length","exec","find","merge","parseHTML","nodeType","ownerDocument","test","isPlainObject","isFunction","attr","getElementById","parentNode","id","makeArray","toArray","call","get","num","pushStack","elems","ret","prevObject","each","callback","args","promise","done","apply","arguments","first","eq","last","i","len","j","map","end","sort","splice","extend","src","copyIsArray","copy","name","options","clone","target","deep","isArray","expando","Math","random","replace","noConflict","isReady","readyWait","holdReady","hold","wait","body","setTimeout","resolveWith","trigger","off","obj","Array","isWindow","isNumeric","isNaN","parseFloat","isFinite","String","key","e","support","ownLast","isEmptyObject","error","msg","Error","data","keepScripts","parsed","scripts","createElement","buildFragment","remove","childNodes","parseJSON","JSON","parse","Function","parseXML","xml","tmp","DOMParser","parseFromString","ActiveXObject","async","loadXML","getElementsByTagName","noop","globalEval","execScript","camelCase","string","nodeName","toLowerCase","value","isArraylike","text","arr","results","Object","inArray","max","second","l","grep","inv","retVal","arg","guid","proxy","access","chainable","emptyGet","raw","bulk","now","Date","getTime","swap","old","style","Deferred","attachEvent","top","frameElement","doScroll","doScrollCheck","split","cachedruns","Expr","getText","isXML","compile","outermostContext","sortInput","setDocument","documentIsHTML","rbuggyQSA","rbuggyMatches","matches","contains","preferredDoc","dirruns","classCache","createCache","tokenCache","compilerCache","hasDuplicate","sortOrder","a","b","strundefined","MAX_NEGATIVE","hasOwn","pop","push_native","booleans","whitespace","characterEncoding","identifier","attributes","pseudos","RegExp","rcomma","rcombinators","rsibling","rattributeQuotes","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rnative","rinputs","rheader","rescape","runescape","funescape","_","escaped","escapedWhitespace","high","fromCharCode","els","Sizzle","seed","m","groups","nid","newContext","newSelector","getElementsByClassName","qsa","tokenize","getAttribute","setAttribute","toSelector","join","querySelectorAll","qsaError","removeAttribute","select","keys","cache","cacheLength","shift","markFunction","assert","div","removeChild","addHandle","attrs","handler","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createPositionalPseudo","argument","matchIndexes","node","doc","parent","defaultView","className","appendChild","createComment","innerHTML","firstChild","getById","getElementsByName","filter","attrId","getAttributeNode","tag","input","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","val","specified","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","nodeValue","selectors","createPseudo","relative",">","dir"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","simple","forward","ofType","outerCache","nodeIndex","start","useCache","lastChild","pseudo","setFilters","idx","matched","not","matcher","unmatched","has","innerText","lang","elemLang","hash","root","focus","activeElement","hasFocus","href","tabIndex","enabled","disabled","checked","selected","selectedIndex","empty","header","button","even","odd","lt","gt","radio","checkbox","file","password","image","submit","reset","filters","parseOnly","tokens","soFar","preFilters","cached","addCombinator","combinator","base","checkNonElements","doneName","dirkey","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","matcherFromGroupMatchers","elementMatchers","setMatchers","matcherCachedRuns","bySet","byElement","superMatcher","expandContext","setMatched","matchedCount","outermost","contextBackup","dirrunsUnique","group","contexts","token","div1","defaultValue","unique","isXMLDoc","optionsCache","createOptions","object","flag","Callbacks","firing","memory","fired","firingLength","firingIndex","firingStart","list","stack","once","fire","stopOnFalse","self","disable","add","index","lock","locked","fireWith","func","tuples","state","always","deferred","fail","then","fns","newDefer","tuple","action","returned","resolve","reject","progress","notify","pipe","stateString","when","subordinate","resolveValues","remaining","updateFunc","values","progressValues","notifyWith","progressContexts","resolveContexts","fragment","opt","eventName","isSupported","cssText","getSetAttribute","leadingWhitespace","tbody","htmlSerialize","hrefNormalized","opacity","cssFloat","checkOn","optSelected","enctype","html5Clone","cloneNode","outerHTML","inlineBlockNeedsLayout","shrinkWrapBlocks","pixelPosition","deleteExpando","noCloneEvent","reliableMarginRight","boxSizingReliable","noCloneChecked","optDisabled","radioValue","createDocumentFragment","appendChecked","checkClone","click","change","focusin","backgroundClip","clearCloneStyle","container","marginDiv","tds","divReset","offsetHeight","display","reliableHiddenOffsets","zoom","boxSizing","offsetWidth","getComputedStyle","width","marginRight","rbrace","rmultiDash","internalData","pvt","acceptData","thisCache","internalKey","isNode","toJSON","internalRemoveData","isEmptyDataObject","cleanData","noData","applet","embed","hasData","removeData","_data","_removeData","dataAttr","queue","dequeue","startLength","hooks","_queueHooks","next","stop","setter","delay","time","fx","speeds","timeout","clearTimeout","clearQueue","count","defer","nodeHook","boolHook","rclass","rreturn","rfocusable","rclickable","ruseDefault","getSetInput","removeAttr","prop","removeProp","propFix","addClass","classes","clazz","proceed","removeClass","toggleClass","stateVal","classNames","hasClass","valHooks","set","option","one","optionSet","nType","attrHooks","propName","attrNames","for","class","notxml","propHooks","tabindex","parseInt","getter","setAttributeNode","createAttribute","coords","contenteditable","rformElems","rkeyEvent","rmouseEvent","rfocusMorph","rtypenamespace","returnTrue","returnFalse","safeActiveElement","err","global","types","events","t","handleObjIn","special","eventHandle","handleObj","handlers","namespaces","origType","elemData","handle","triggered","dispatch","delegateType","bindType","namespace","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","onlyHandlers","ontype","bubbleType","eventPath","Event","isTrigger","namespace_re","noBubble","parentWindow","isPropagationStopped","preventDefault","isDefaultPrevented","_default","fix","handlerQueue","delegateTarget","preDispatch","currentTarget","isImmediatePropagationStopped","stopPropagation","postDispatch","sel","originalEvent","fixHook","fixHooks","mouseHooks","keyHooks","props","srcElement","metaKey","original","which","charCode","keyCode","eventDoc","fromElement","pageX","clientX","scrollLeft","clientLeft","pageY","clientY","scrollTop","clientTop","relatedTarget","toElement","load","blur","beforeunload","returnValue","simulate","bubble","isSimulated","defaultPrevented","getPreventDefault","timeStamp","cancelBubble","stopImmediatePropagation","mouseenter","mouseleave","orig","related","submitBubbles","form","_submit_bubble","changeBubbles","propertyName","_just_changed","focusinBubbles","attaches","on","origFn","triggerHandler","isSimple","rparentsprev","rneedsContext","guaranteedUnique","children","contents","prev","targets","winnow","is","closest","pos","prevAll","addBack","sibling","parents","parentsUntil","until","nextAll","nextUntil","prevUntil","siblings","contentDocument","contentWindow","reverse","n","r","qualifier","createSafeFragment","nodeNames","safeFrag","rinlinejQuery","rnoshimcache","rleadingWhitespace","rxhtmlTag","rtagName","rtbody","rhtml","rnoInnerhtml","manipulation_rcheckableType","rchecked","rscriptType","rscriptTypeMasked","rcleanScript","wrapMap","legend","area","param","thead","tr","col","td","safeFragment","fragmentDiv","optgroup","tfoot","colgroup","caption","th","append","createTextNode","domManip","manipulationTarget","prepend","insertBefore","before","after","keepData","getAll","setGlobalEval","dataAndEvents","deepDataAndEvents","html","replaceWith","allowIntersection","hasScripts","iNoClone","disableScript","restoreScript","_evalUrl","content","refElements","cloneCopyEvent","dest","oldData","curData","fixCloneNodeIssues","defaultChecked","defaultSelected","appendTo","prependTo","insertAfter","replaceAll","insert","found","fixDefaultChecked","destElements","srcElements","inPage","selection","wrap","safe","nodes","url","ajax","dataType","throws","wrapAll","wrapInner","unwrap","iframe","getStyles","curCSS","ralpha","ropacity","rposition","rdisplayswap","rmargin","rnumsplit","rnumnonpx","rrelNum","elemdisplay","BODY","cssShow","position","visibility","cssNormalTransform","letterSpacing","fontWeight","cssExpand","cssPrefixes","vendorPropName","capName","origName","isHidden","el","css","showHide","show","hidden","css_defaultDisplay","styles","hide","toggle","cssHooks","computed","cssNumber","columnCount","fillOpacity","lineHeight","order","orphans","widows","zIndex","cssProps","float","extra","_computed","minWidth","maxWidth","getPropertyValue","currentStyle","left","rs","rsLeft","runtimeStyle","pixelLeft","setPositiveNumber","subtract","augmentWidthOrHeight","isBorderBox","getWidthOrHeight","valueIsBorderBox","actualDisplay","write","close","$1","visible","margin","padding","border","prefix","suffix","expand","expanded","parts","r20","rbracket","rCRLF","rsubmitterTypes","rsubmittable","serialize","serializeArray","traditional","s","encodeURIComponent","ajaxSettings","buildParams","v","hover","fnOver","fnOut","bind","unbind","delegate","undelegate","ajaxLocParts","ajaxLocation","ajax_nonce","ajax_rquery","rhash","rts","rheaders","rlocalProtocol","rnoContent","rprotocol","rurl","_load","prefilters","transports","allTypes","addToPrefiltersOrTransports","structure","dataTypeExpression","dataTypes","inspectPrefiltersOrTransports","originalOptions","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","params","response","responseText","complete","status","active","lastModified","etag","isLocal","processData","contentType","accepts","*","json","responseFields","converters","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","cacheURL","responseHeadersString","timeoutTimer","fireGlobals","transport","responseHeaders","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","lname","overrideMimeType","mimeType","code","abort","statusText","finalText","success","method","crossDomain","hasContent","ifModified","headers","beforeSend","send","nativeStatusText","responses","isSuccess","modified","ajaxHandleResponses","ajaxConvert","rejectWith","getJSON","getScript","firstDataType","ct","finalDataType","conv2","current","conv","dataFilter","script","text script","head","scriptCharset","charset","onload","onreadystatechange","isAbort","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","xhrCallbacks","xhrSupported","xhrId","xhrOnUnloadAbort","createStandardXHR","XMLHttpRequest","createActiveXHR","xhr","cors","username","open","xhrFields","firefoxAccessException","unload","fxNow","timerId","rfxtypes","rfxnum","rrun","animationPrefilters","defaultPrefilter","tweeners","tween","createTween","unit","scale","maxIterations","createFxNow","animation","collection","Animation","properties","stopped","tick","currentTime","startTime","duration","percent","tweens","run","opts","specialEasing","originalProperties","Tween","easing","gotoEnd","propFilter","timer","anim","tweener","prefilter","oldfire","dataShow","unqueued","overflow","overflowX","overflowY","eased","step","cssFn","speed","animate","genFx","fadeTo","to","optall","doAnimation","finish","stopQueue","timers","includeWidth","height","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","linear","p","swing","cos","PI","interval","setInterval","clearInterval","slow","fast","animated","offset","setOffset","win","box","getBoundingClientRect","getWindow","pageYOffset","pageXOffset","curElem","curOffset","curCSSTop","curCSSLeft","calculatePosition","curPosition","curTop","curLeft","using","offsetParent","parentOffset","scrollTo","Height","Width","defaultExtra","funcName","size","andSelf","module","exports","define","amd"],"mappings":"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"}
\ No newline at end of file
diff --git a/Fitbit.Portable.DebugSite/Scripts/jquery.validate.js b/Fitbit.Portable.DebugSite/Scripts/jquery.validate.js
deleted file mode 100644
index 88ba300e..00000000
--- a/Fitbit.Portable.DebugSite/Scripts/jquery.validate.js
+++ /dev/null
@@ -1,1231 +0,0 @@
-/*!
- * jQuery Validation Plugin 1.11.1
- *
- * http://bassistance.de/jquery-plugins/jquery-plugin-validation/
- * http://docs.jquery.com/Plugins/Validation
- *
- * Copyright 2013 Jörn Zaefferer
- * Released under the MIT license:
- * http://www.opensource.org/licenses/mit-license.php
- */
-
-(function($) {
-
-$.extend($.fn, {
- // http://docs.jquery.com/Plugins/Validation/validate
- validate: function( options ) {
-
- // if nothing is selected, return nothing; can't chain anyway
- if ( !this.length ) {
- if ( options && options.debug && window.console ) {
- console.warn( "Nothing selected, can't validate, returning nothing." );
- }
- return;
- }
-
- // check if a validator for this form was already created
- var validator = $.data( this[0], "validator" );
- if ( validator ) {
- return validator;
- }
-
- // Add novalidate tag if HTML5.
- this.attr( "novalidate", "novalidate" );
-
- validator = new $.validator( options, this[0] );
- $.data( this[0], "validator", validator );
-
- if ( validator.settings.onsubmit ) {
-
- this.validateDelegate( ":submit", "click", function( event ) {
- if ( validator.settings.submitHandler ) {
- validator.submitButton = event.target;
- }
- // allow suppressing validation by adding a cancel class to the submit button
- if ( $(event.target).hasClass("cancel") ) {
- validator.cancelSubmit = true;
- }
-
- // allow suppressing validation by adding the html5 formnovalidate attribute to the submit button
- if ( $(event.target).attr("formnovalidate") !== undefined ) {
- validator.cancelSubmit = true;
- }
- });
-
- // validate the form on submit
- this.submit( function( event ) {
- if ( validator.settings.debug ) {
- // prevent form submit to be able to see console output
- event.preventDefault();
- }
- function handle() {
- var hidden;
- if ( validator.settings.submitHandler ) {
- if ( validator.submitButton ) {
- // insert a hidden input as a replacement for the missing submit button
- hidden = $("
").attr("name", validator.submitButton.name).val( $(validator.submitButton).val() ).appendTo(validator.currentForm);
- }
- validator.settings.submitHandler.call( validator, validator.currentForm, event );
- if ( validator.submitButton ) {
- // and clean up afterwards; thanks to no-block-scope, hidden can be referenced
- hidden.remove();
- }
- return false;
- }
- return true;
- }
-
- // prevent submit for invalid forms or custom submit handlers
- if ( validator.cancelSubmit ) {
- validator.cancelSubmit = false;
- return handle();
- }
- if ( validator.form() ) {
- if ( validator.pendingRequest ) {
- validator.formSubmitted = true;
- return false;
- }
- return handle();
- } else {
- validator.focusInvalid();
- return false;
- }
- });
- }
-
- return validator;
- },
- // http://docs.jquery.com/Plugins/Validation/valid
- valid: function() {
- if ( $(this[0]).is("form")) {
- return this.validate().form();
- } else {
- var valid = true;
- var validator = $(this[0].form).validate();
- this.each(function() {
- valid = valid && validator.element(this);
- });
- return valid;
- }
- },
- // attributes: space seperated list of attributes to retrieve and remove
- removeAttrs: function( attributes ) {
- var result = {},
- $element = this;
- $.each(attributes.split(/\s/), function( index, value ) {
- result[value] = $element.attr(value);
- $element.removeAttr(value);
- });
- return result;
- },
- // http://docs.jquery.com/Plugins/Validation/rules
- rules: function( command, argument ) {
- var element = this[0];
-
- if ( command ) {
- var settings = $.data(element.form, "validator").settings;
- var staticRules = settings.rules;
- var existingRules = $.validator.staticRules(element);
- switch(command) {
- case "add":
- $.extend(existingRules, $.validator.normalizeRule(argument));
- // remove messages from rules, but allow them to be set separetely
- delete existingRules.messages;
- staticRules[element.name] = existingRules;
- if ( argument.messages ) {
- settings.messages[element.name] = $.extend( settings.messages[element.name], argument.messages );
- }
- break;
- case "remove":
- if ( !argument ) {
- delete staticRules[element.name];
- return existingRules;
- }
- var filtered = {};
- $.each(argument.split(/\s/), function( index, method ) {
- filtered[method] = existingRules[method];
- delete existingRules[method];
- });
- return filtered;
- }
- }
-
- var data = $.validator.normalizeRules(
- $.extend(
- {},
- $.validator.classRules(element),
- $.validator.attributeRules(element),
- $.validator.dataRules(element),
- $.validator.staticRules(element)
- ), element);
-
- // make sure required is at front
- if ( data.required ) {
- var param = data.required;
- delete data.required;
- data = $.extend({required: param}, data);
- }
-
- return data;
- }
-});
-
-// Custom selectors
-$.extend($.expr[":"], {
- // http://docs.jquery.com/Plugins/Validation/blank
- blank: function( a ) { return !$.trim("" + $(a).val()); },
- // http://docs.jquery.com/Plugins/Validation/filled
- filled: function( a ) { return !!$.trim("" + $(a).val()); },
- // http://docs.jquery.com/Plugins/Validation/unchecked
- unchecked: function( a ) { return !$(a).prop("checked"); }
-});
-
-// constructor for validator
-$.validator = function( options, form ) {
- this.settings = $.extend( true, {}, $.validator.defaults, options );
- this.currentForm = form;
- this.init();
-};
-
-$.validator.format = function( source, params ) {
- if ( arguments.length === 1 ) {
- return function() {
- var args = $.makeArray(arguments);
- args.unshift(source);
- return $.validator.format.apply( this, args );
- };
- }
- if ( arguments.length > 2 && params.constructor !== Array ) {
- params = $.makeArray(arguments).slice(1);
- }
- if ( params.constructor !== Array ) {
- params = [ params ];
- }
- $.each(params, function( i, n ) {
- source = source.replace( new RegExp("\\{" + i + "\\}", "g"), function() {
- return n;
- });
- });
- return source;
-};
-
-$.extend($.validator, {
-
- defaults: {
- messages: {},
- groups: {},
- rules: {},
- errorClass: "error",
- validClass: "valid",
- errorElement: "label",
- focusInvalid: true,
- errorContainer: $([]),
- errorLabelContainer: $([]),
- onsubmit: true,
- ignore: ":hidden",
- ignoreTitle: false,
- onfocusin: function( element, event ) {
- this.lastActive = element;
-
- // hide error label and remove error class on focus if enabled
- if ( this.settings.focusCleanup && !this.blockFocusCleanup ) {
- if ( this.settings.unhighlight ) {
- this.settings.unhighlight.call( this, element, this.settings.errorClass, this.settings.validClass );
- }
- this.addWrapper(this.errorsFor(element)).hide();
- }
- },
- onfocusout: function( element, event ) {
- if ( !this.checkable(element) && (element.name in this.submitted || !this.optional(element)) ) {
- this.element(element);
- }
- },
- onkeyup: function( element, event ) {
- if ( event.which === 9 && this.elementValue(element) === "" ) {
- return;
- } else if ( element.name in this.submitted || element === this.lastElement ) {
- this.element(element);
- }
- },
- onclick: function( element, event ) {
- // click on selects, radiobuttons and checkboxes
- if ( element.name in this.submitted ) {
- this.element(element);
- }
- // or option elements, check parent select in that case
- else if ( element.parentNode.name in this.submitted ) {
- this.element(element.parentNode);
- }
- },
- highlight: function( element, errorClass, validClass ) {
- if ( element.type === "radio" ) {
- this.findByName(element.name).addClass(errorClass).removeClass(validClass);
- } else {
- $(element).addClass(errorClass).removeClass(validClass);
- }
- },
- unhighlight: function( element, errorClass, validClass ) {
- if ( element.type === "radio" ) {
- this.findByName(element.name).removeClass(errorClass).addClass(validClass);
- } else {
- $(element).removeClass(errorClass).addClass(validClass);
- }
- }
- },
-
- // http://docs.jquery.com/Plugins/Validation/Validator/setDefaults
- setDefaults: function( settings ) {
- $.extend( $.validator.defaults, settings );
- },
-
- messages: {
- required: "This field is required.",
- remote: "Please fix this field.",
- email: "Please enter a valid email address.",
- url: "Please enter a valid URL.",
- date: "Please enter a valid date.",
- dateISO: "Please enter a valid date (ISO).",
- number: "Please enter a valid number.",
- digits: "Please enter only digits.",
- creditcard: "Please enter a valid credit card number.",
- equalTo: "Please enter the same value again.",
- maxlength: $.validator.format("Please enter no more than {0} characters."),
- minlength: $.validator.format("Please enter at least {0} characters."),
- rangelength: $.validator.format("Please enter a value between {0} and {1} characters long."),
- range: $.validator.format("Please enter a value between {0} and {1}."),
- max: $.validator.format("Please enter a value less than or equal to {0}."),
- min: $.validator.format("Please enter a value greater than or equal to {0}.")
- },
-
- autoCreateRanges: false,
-
- prototype: {
-
- init: function() {
- this.labelContainer = $(this.settings.errorLabelContainer);
- this.errorContext = this.labelContainer.length && this.labelContainer || $(this.currentForm);
- this.containers = $(this.settings.errorContainer).add( this.settings.errorLabelContainer );
- this.submitted = {};
- this.valueCache = {};
- this.pendingRequest = 0;
- this.pending = {};
- this.invalid = {};
- this.reset();
-
- var groups = (this.groups = {});
- $.each(this.settings.groups, function( key, value ) {
- if ( typeof value === "string" ) {
- value = value.split(/\s/);
- }
- $.each(value, function( index, name ) {
- groups[name] = key;
- });
- });
- var rules = this.settings.rules;
- $.each(rules, function( key, value ) {
- rules[key] = $.validator.normalizeRule(value);
- });
-
- function delegate(event) {
- var validator = $.data(this[0].form, "validator"),
- eventType = "on" + event.type.replace(/^validate/, "");
- if ( validator.settings[eventType] ) {
- validator.settings[eventType].call(validator, this[0], event);
- }
- }
- $(this.currentForm)
- .validateDelegate(":text, [type='password'], [type='file'], select, textarea, " +
- "[type='number'], [type='search'] ,[type='tel'], [type='url'], " +
- "[type='email'], [type='datetime'], [type='date'], [type='month'], " +
- "[type='week'], [type='time'], [type='datetime-local'], " +
- "[type='range'], [type='color'] ",
- "focusin focusout keyup", delegate)
- .validateDelegate("[type='radio'], [type='checkbox'], select, option", "click", delegate);
-
- if ( this.settings.invalidHandler ) {
- $(this.currentForm).bind("invalid-form.validate", this.settings.invalidHandler);
- }
- },
-
- // http://docs.jquery.com/Plugins/Validation/Validator/form
- form: function() {
- this.checkForm();
- $.extend(this.submitted, this.errorMap);
- this.invalid = $.extend({}, this.errorMap);
- if ( !this.valid() ) {
- $(this.currentForm).triggerHandler("invalid-form", [this]);
- }
- this.showErrors();
- return this.valid();
- },
-
- checkForm: function() {
- this.prepareForm();
- for ( var i = 0, elements = (this.currentElements = this.elements()); elements[i]; i++ ) {
- this.check( elements[i] );
- }
- return this.valid();
- },
-
- // http://docs.jquery.com/Plugins/Validation/Validator/element
- element: function( element ) {
- element = this.validationTargetFor( this.clean( element ) );
- this.lastElement = element;
- this.prepareElement( element );
- this.currentElements = $(element);
- var result = this.check( element ) !== false;
- if ( result ) {
- delete this.invalid[element.name];
- } else {
- this.invalid[element.name] = true;
- }
- if ( !this.numberOfInvalids() ) {
- // Hide error containers on last error
- this.toHide = this.toHide.add( this.containers );
- }
- this.showErrors();
- return result;
- },
-
- // http://docs.jquery.com/Plugins/Validation/Validator/showErrors
- showErrors: function( errors ) {
- if ( errors ) {
- // add items to error list and map
- $.extend( this.errorMap, errors );
- this.errorList = [];
- for ( var name in errors ) {
- this.errorList.push({
- message: errors[name],
- element: this.findByName(name)[0]
- });
- }
- // remove items from success list
- this.successList = $.grep( this.successList, function( element ) {
- return !(element.name in errors);
- });
- }
- if ( this.settings.showErrors ) {
- this.settings.showErrors.call( this, this.errorMap, this.errorList );
- } else {
- this.defaultShowErrors();
- }
- },
-
- // http://docs.jquery.com/Plugins/Validation/Validator/resetForm
- resetForm: function() {
- if ( $.fn.resetForm ) {
- $(this.currentForm).resetForm();
- }
- this.submitted = {};
- this.lastElement = null;
- this.prepareForm();
- this.hideErrors();
- this.elements().removeClass( this.settings.errorClass ).removeData( "previousValue" );
- },
-
- numberOfInvalids: function() {
- return this.objectLength(this.invalid);
- },
-
- objectLength: function( obj ) {
- var count = 0;
- for ( var i in obj ) {
- count++;
- }
- return count;
- },
-
- hideErrors: function() {
- this.addWrapper( this.toHide ).hide();
- },
-
- valid: function() {
- return this.size() === 0;
- },
-
- size: function() {
- return this.errorList.length;
- },
-
- focusInvalid: function() {
- if ( this.settings.focusInvalid ) {
- try {
- $(this.findLastActive() || this.errorList.length && this.errorList[0].element || [])
- .filter(":visible")
- .focus()
- // manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find
- .trigger("focusin");
- } catch(e) {
- // ignore IE throwing errors when focusing hidden elements
- }
- }
- },
-
- findLastActive: function() {
- var lastActive = this.lastActive;
- return lastActive && $.grep(this.errorList, function( n ) {
- return n.element.name === lastActive.name;
- }).length === 1 && lastActive;
- },
-
- elements: function() {
- var validator = this,
- rulesCache = {};
-
- // select all valid inputs inside the form (no submit or reset buttons)
- return $(this.currentForm)
- .find("input, select, textarea")
- .not(":submit, :reset, :image, [disabled]")
- .not( this.settings.ignore )
- .filter(function() {
- if ( !this.name && validator.settings.debug && window.console ) {
- console.error( "%o has no name assigned", this);
- }
-
- // select only the first element for each name, and only those with rules specified
- if ( this.name in rulesCache || !validator.objectLength($(this).rules()) ) {
- return false;
- }
-
- rulesCache[this.name] = true;
- return true;
- });
- },
-
- clean: function( selector ) {
- return $(selector)[0];
- },
-
- errors: function() {
- var errorClass = this.settings.errorClass.replace(" ", ".");
- return $(this.settings.errorElement + "." + errorClass, this.errorContext);
- },
-
- reset: function() {
- this.successList = [];
- this.errorList = [];
- this.errorMap = {};
- this.toShow = $([]);
- this.toHide = $([]);
- this.currentElements = $([]);
- },
-
- prepareForm: function() {
- this.reset();
- this.toHide = this.errors().add( this.containers );
- },
-
- prepareElement: function( element ) {
- this.reset();
- this.toHide = this.errorsFor(element);
- },
-
- elementValue: function( element ) {
- var type = $(element).attr("type"),
- val = $(element).val();
-
- if ( type === "radio" || type === "checkbox" ) {
- return $("input[name='" + $(element).attr("name") + "']:checked").val();
- }
-
- if ( typeof val === "string" ) {
- return val.replace(/\r/g, "");
- }
- return val;
- },
-
- check: function( element ) {
- element = this.validationTargetFor( this.clean( element ) );
-
- var rules = $(element).rules();
- var dependencyMismatch = false;
- var val = this.elementValue(element);
- var result;
-
- for (var method in rules ) {
- var rule = { method: method, parameters: rules[method] };
- try {
-
- result = $.validator.methods[method].call( this, val, element, rule.parameters );
-
- // if a method indicates that the field is optional and therefore valid,
- // don't mark it as valid when there are no other rules
- if ( result === "dependency-mismatch" ) {
- dependencyMismatch = true;
- continue;
- }
- dependencyMismatch = false;
-
- if ( result === "pending" ) {
- this.toHide = this.toHide.not( this.errorsFor(element) );
- return;
- }
-
- if ( !result ) {
- this.formatAndAdd( element, rule );
- return false;
- }
- } catch(e) {
- if ( this.settings.debug && window.console ) {
- console.log( "Exception occurred when checking element " + element.id + ", check the '" + rule.method + "' method.", e );
- }
- throw e;
- }
- }
- if ( dependencyMismatch ) {
- return;
- }
- if ( this.objectLength(rules) ) {
- this.successList.push(element);
- }
- return true;
- },
-
- // return the custom message for the given element and validation method
- // specified in the element's HTML5 data attribute
- customDataMessage: function( element, method ) {
- return $(element).data("msg-" + method.toLowerCase()) || (element.attributes && $(element).attr("data-msg-" + method.toLowerCase()));
- },
-
- // return the custom message for the given element name and validation method
- customMessage: function( name, method ) {
- var m = this.settings.messages[name];
- return m && (m.constructor === String ? m : m[method]);
- },
-
- // return the first defined argument, allowing empty strings
- findDefined: function() {
- for(var i = 0; i < arguments.length; i++) {
- if ( arguments[i] !== undefined ) {
- return arguments[i];
- }
- }
- return undefined;
- },
-
- defaultMessage: function( element, method ) {
- return this.findDefined(
- this.customMessage( element.name, method ),
- this.customDataMessage( element, method ),
- // title is never undefined, so handle empty string as undefined
- !this.settings.ignoreTitle && element.title || undefined,
- $.validator.messages[method],
- "
Warning: No message defined for " + element.name + ""
- );
- },
-
- formatAndAdd: function( element, rule ) {
- var message = this.defaultMessage( element, rule.method ),
- theregex = /\$?\{(\d+)\}/g;
- if ( typeof message === "function" ) {
- message = message.call(this, rule.parameters, element);
- } else if (theregex.test(message)) {
- message = $.validator.format(message.replace(theregex, "{$1}"), rule.parameters);
- }
- this.errorList.push({
- message: message,
- element: element
- });
-
- this.errorMap[element.name] = message;
- this.submitted[element.name] = message;
- },
-
- addWrapper: function( toToggle ) {
- if ( this.settings.wrapper ) {
- toToggle = toToggle.add( toToggle.parent( this.settings.wrapper ) );
- }
- return toToggle;
- },
-
- defaultShowErrors: function() {
- var i, elements;
- for ( i = 0; this.errorList[i]; i++ ) {
- var error = this.errorList[i];
- if ( this.settings.highlight ) {
- this.settings.highlight.call( this, error.element, this.settings.errorClass, this.settings.validClass );
- }
- this.showLabel( error.element, error.message );
- }
- if ( this.errorList.length ) {
- this.toShow = this.toShow.add( this.containers );
- }
- if ( this.settings.success ) {
- for ( i = 0; this.successList[i]; i++ ) {
- this.showLabel( this.successList[i] );
- }
- }
- if ( this.settings.unhighlight ) {
- for ( i = 0, elements = this.validElements(); elements[i]; i++ ) {
- this.settings.unhighlight.call( this, elements[i], this.settings.errorClass, this.settings.validClass );
- }
- }
- this.toHide = this.toHide.not( this.toShow );
- this.hideErrors();
- this.addWrapper( this.toShow ).show();
- },
-
- validElements: function() {
- return this.currentElements.not(this.invalidElements());
- },
-
- invalidElements: function() {
- return $(this.errorList).map(function() {
- return this.element;
- });
- },
-
- showLabel: function( element, message ) {
- var label = this.errorsFor( element );
- if ( label.length ) {
- // refresh error/success class
- label.removeClass( this.settings.validClass ).addClass( this.settings.errorClass );
- // replace message on existing label
- label.html(message);
- } else {
- // create label
- label = $("<" + this.settings.errorElement + ">")
- .attr("for", this.idOrName(element))
- .addClass(this.settings.errorClass)
- .html(message || "");
- if ( this.settings.wrapper ) {
- // make sure the element is visible, even in IE
- // actually showing the wrapped element is handled elsewhere
- label = label.hide().show().wrap("<" + this.settings.wrapper + "/>").parent();
- }
- if ( !this.labelContainer.append(label).length ) {
- if ( this.settings.errorPlacement ) {
- this.settings.errorPlacement(label, $(element) );
- } else {
- label.insertAfter(element);
- }
- }
- }
- if ( !message && this.settings.success ) {
- label.text("");
- if ( typeof this.settings.success === "string" ) {
- label.addClass( this.settings.success );
- } else {
- this.settings.success( label, element );
- }
- }
- this.toShow = this.toShow.add(label);
- },
-
- errorsFor: function( element ) {
- var name = this.idOrName(element);
- return this.errors().filter(function() {
- return $(this).attr("for") === name;
- });
- },
-
- idOrName: function( element ) {
- return this.groups[element.name] || (this.checkable(element) ? element.name : element.id || element.name);
- },
-
- validationTargetFor: function( element ) {
- // if radio/checkbox, validate first element in group instead
- if ( this.checkable(element) ) {
- element = this.findByName( element.name ).not(this.settings.ignore)[0];
- }
- return element;
- },
-
- checkable: function( element ) {
- return (/radio|checkbox/i).test(element.type);
- },
-
- findByName: function( name ) {
- return $(this.currentForm).find("[name='" + name + "']");
- },
-
- getLength: function( value, element ) {
- switch( element.nodeName.toLowerCase() ) {
- case "select":
- return $("option:selected", element).length;
- case "input":
- if ( this.checkable( element) ) {
- return this.findByName(element.name).filter(":checked").length;
- }
- }
- return value.length;
- },
-
- depend: function( param, element ) {
- return this.dependTypes[typeof param] ? this.dependTypes[typeof param](param, element) : true;
- },
-
- dependTypes: {
- "boolean": function( param, element ) {
- return param;
- },
- "string": function( param, element ) {
- return !!$(param, element.form).length;
- },
- "function": function( param, element ) {
- return param(element);
- }
- },
-
- optional: function( element ) {
- var val = this.elementValue(element);
- return !$.validator.methods.required.call(this, val, element) && "dependency-mismatch";
- },
-
- startRequest: function( element ) {
- if ( !this.pending[element.name] ) {
- this.pendingRequest++;
- this.pending[element.name] = true;
- }
- },
-
- stopRequest: function( element, valid ) {
- this.pendingRequest--;
- // sometimes synchronization fails, make sure pendingRequest is never < 0
- if ( this.pendingRequest < 0 ) {
- this.pendingRequest = 0;
- }
- delete this.pending[element.name];
- if ( valid && this.pendingRequest === 0 && this.formSubmitted && this.form() ) {
- $(this.currentForm).submit();
- this.formSubmitted = false;
- } else if (!valid && this.pendingRequest === 0 && this.formSubmitted) {
- $(this.currentForm).triggerHandler("invalid-form", [this]);
- this.formSubmitted = false;
- }
- },
-
- previousValue: function( element ) {
- return $.data(element, "previousValue") || $.data(element, "previousValue", {
- old: null,
- valid: true,
- message: this.defaultMessage( element, "remote" )
- });
- }
-
- },
-
- classRuleSettings: {
- required: {required: true},
- email: {email: true},
- url: {url: true},
- date: {date: true},
- dateISO: {dateISO: true},
- number: {number: true},
- digits: {digits: true},
- creditcard: {creditcard: true}
- },
-
- addClassRules: function( className, rules ) {
- if ( className.constructor === String ) {
- this.classRuleSettings[className] = rules;
- } else {
- $.extend(this.classRuleSettings, className);
- }
- },
-
- classRules: function( element ) {
- var rules = {};
- var classes = $(element).attr("class");
- if ( classes ) {
- $.each(classes.split(" "), function() {
- if ( this in $.validator.classRuleSettings ) {
- $.extend(rules, $.validator.classRuleSettings[this]);
- }
- });
- }
- return rules;
- },
-
- attributeRules: function( element ) {
- var rules = {};
- var $element = $(element);
- var type = $element[0].getAttribute("type");
-
- for (var method in $.validator.methods) {
- var value;
-
- // support for
in both html5 and older browsers
- if ( method === "required" ) {
- value = $element.get(0).getAttribute(method);
- // Some browsers return an empty string for the required attribute
- // and non-HTML5 browsers might have required="" markup
- if ( value === "" ) {
- value = true;
- }
- // force non-HTML5 browsers to return bool
- value = !!value;
- } else {
- value = $element.attr(method);
- }
-
- // convert the value to a number for number inputs, and for text for backwards compability
- // allows type="date" and others to be compared as strings
- if ( /min|max/.test( method ) && ( type === null || /number|range|text/.test( type ) ) ) {
- value = Number(value);
- }
-
- if ( value ) {
- rules[method] = value;
- } else if ( type === method && type !== 'range' ) {
- // exception: the jquery validate 'range' method
- // does not test for the html5 'range' type
- rules[method] = true;
- }
- }
-
- // maxlength may be returned as -1, 2147483647 (IE) and 524288 (safari) for text inputs
- if ( rules.maxlength && /-1|2147483647|524288/.test(rules.maxlength) ) {
- delete rules.maxlength;
- }
-
- return rules;
- },
-
- dataRules: function( element ) {
- var method, value,
- rules = {}, $element = $(element);
- for (method in $.validator.methods) {
- value = $element.data("rule-" + method.toLowerCase());
- if ( value !== undefined ) {
- rules[method] = value;
- }
- }
- return rules;
- },
-
- staticRules: function( element ) {
- var rules = {};
- var validator = $.data(element.form, "validator");
- if ( validator.settings.rules ) {
- rules = $.validator.normalizeRule(validator.settings.rules[element.name]) || {};
- }
- return rules;
- },
-
- normalizeRules: function( rules, element ) {
- // handle dependency check
- $.each(rules, function( prop, val ) {
- // ignore rule when param is explicitly false, eg. required:false
- if ( val === false ) {
- delete rules[prop];
- return;
- }
- if ( val.param || val.depends ) {
- var keepRule = true;
- switch (typeof val.depends) {
- case "string":
- keepRule = !!$(val.depends, element.form).length;
- break;
- case "function":
- keepRule = val.depends.call(element, element);
- break;
- }
- if ( keepRule ) {
- rules[prop] = val.param !== undefined ? val.param : true;
- } else {
- delete rules[prop];
- }
- }
- });
-
- // evaluate parameters
- $.each(rules, function( rule, parameter ) {
- rules[rule] = $.isFunction(parameter) ? parameter(element) : parameter;
- });
-
- // clean number parameters
- $.each(['minlength', 'maxlength'], function() {
- if ( rules[this] ) {
- rules[this] = Number(rules[this]);
- }
- });
- $.each(['rangelength', 'range'], function() {
- var parts;
- if ( rules[this] ) {
- if ( $.isArray(rules[this]) ) {
- rules[this] = [Number(rules[this][0]), Number(rules[this][1])];
- } else if ( typeof rules[this] === "string" ) {
- parts = rules[this].split(/[\s,]+/);
- rules[this] = [Number(parts[0]), Number(parts[1])];
- }
- }
- });
-
- if ( $.validator.autoCreateRanges ) {
- // auto-create ranges
- if ( rules.min && rules.max ) {
- rules.range = [rules.min, rules.max];
- delete rules.min;
- delete rules.max;
- }
- if ( rules.minlength && rules.maxlength ) {
- rules.rangelength = [rules.minlength, rules.maxlength];
- delete rules.minlength;
- delete rules.maxlength;
- }
- }
-
- return rules;
- },
-
- // Converts a simple string to a {string: true} rule, e.g., "required" to {required:true}
- normalizeRule: function( data ) {
- if ( typeof data === "string" ) {
- var transformed = {};
- $.each(data.split(/\s/), function() {
- transformed[this] = true;
- });
- data = transformed;
- }
- return data;
- },
-
- // http://docs.jquery.com/Plugins/Validation/Validator/addMethod
- addMethod: function( name, method, message ) {
- $.validator.methods[name] = method;
- $.validator.messages[name] = message !== undefined ? message : $.validator.messages[name];
- if ( method.length < 3 ) {
- $.validator.addClassRules(name, $.validator.normalizeRule(name));
- }
- },
-
- methods: {
-
- // http://docs.jquery.com/Plugins/Validation/Methods/required
- required: function( value, element, param ) {
- // check if dependency is met
- if ( !this.depend(param, element) ) {
- return "dependency-mismatch";
- }
- if ( element.nodeName.toLowerCase() === "select" ) {
- // could be an array for select-multiple or a string, both are fine this way
- var val = $(element).val();
- return val && val.length > 0;
- }
- if ( this.checkable(element) ) {
- return this.getLength(value, element) > 0;
- }
- return $.trim(value).length > 0;
- },
-
- // http://docs.jquery.com/Plugins/Validation/Methods/email
- email: function( value, element ) {
- // contributed by Scott Gonzalez: http://projects.scottsplayground.com/email_address_validation/
- return this.optional(element) || /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i.test(value);
- },
-
- // http://docs.jquery.com/Plugins/Validation/Methods/url
- url: function( value, element ) {
- // contributed by Scott Gonzalez: http://projects.scottsplayground.com/iri/
- return this.optional(element) || /^(https?|s?ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(value);
- },
-
- // http://docs.jquery.com/Plugins/Validation/Methods/date
- date: function( value, element ) {
- return this.optional(element) || !/Invalid|NaN/.test(new Date(value).toString());
- },
-
- // http://docs.jquery.com/Plugins/Validation/Methods/dateISO
- dateISO: function( value, element ) {
- return this.optional(element) || /^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/.test(value);
- },
-
- // http://docs.jquery.com/Plugins/Validation/Methods/number
- number: function( value, element ) {
- return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(value);
- },
-
- // http://docs.jquery.com/Plugins/Validation/Methods/digits
- digits: function( value, element ) {
- return this.optional(element) || /^\d+$/.test(value);
- },
-
- // http://docs.jquery.com/Plugins/Validation/Methods/creditcard
- // based on http://en.wikipedia.org/wiki/Luhn
- creditcard: function( value, element ) {
- if ( this.optional(element) ) {
- return "dependency-mismatch";
- }
- // accept only spaces, digits and dashes
- if ( /[^0-9 \-]+/.test(value) ) {
- return false;
- }
- var nCheck = 0,
- nDigit = 0,
- bEven = false;
-
- value = value.replace(/\D/g, "");
-
- for (var n = value.length - 1; n >= 0; n--) {
- var cDigit = value.charAt(n);
- nDigit = parseInt(cDigit, 10);
- if ( bEven ) {
- if ( (nDigit *= 2) > 9 ) {
- nDigit -= 9;
- }
- }
- nCheck += nDigit;
- bEven = !bEven;
- }
-
- return (nCheck % 10) === 0;
- },
-
- // http://docs.jquery.com/Plugins/Validation/Methods/minlength
- minlength: function( value, element, param ) {
- var length = $.isArray( value ) ? value.length : this.getLength($.trim(value), element);
- return this.optional(element) || length >= param;
- },
-
- // http://docs.jquery.com/Plugins/Validation/Methods/maxlength
- maxlength: function( value, element, param ) {
- var length = $.isArray( value ) ? value.length : this.getLength($.trim(value), element);
- return this.optional(element) || length <= param;
- },
-
- // http://docs.jquery.com/Plugins/Validation/Methods/rangelength
- rangelength: function( value, element, param ) {
- var length = $.isArray( value ) ? value.length : this.getLength($.trim(value), element);
- return this.optional(element) || ( length >= param[0] && length <= param[1] );
- },
-
- // http://docs.jquery.com/Plugins/Validation/Methods/min
- min: function( value, element, param ) {
- return this.optional(element) || value >= param;
- },
-
- // http://docs.jquery.com/Plugins/Validation/Methods/max
- max: function( value, element, param ) {
- return this.optional(element) || value <= param;
- },
-
- // http://docs.jquery.com/Plugins/Validation/Methods/range
- range: function( value, element, param ) {
- return this.optional(element) || ( value >= param[0] && value <= param[1] );
- },
-
- // http://docs.jquery.com/Plugins/Validation/Methods/equalTo
- equalTo: function( value, element, param ) {
- // bind to the blur event of the target in order to revalidate whenever the target field is updated
- // TODO find a way to bind the event just once, avoiding the unbind-rebind overhead
- var target = $(param);
- if ( this.settings.onfocusout ) {
- target.unbind(".validate-equalTo").bind("blur.validate-equalTo", function() {
- $(element).valid();
- });
- }
- return value === target.val();
- },
-
- // http://docs.jquery.com/Plugins/Validation/Methods/remote
- remote: function( value, element, param ) {
- if ( this.optional(element) ) {
- return "dependency-mismatch";
- }
-
- var previous = this.previousValue(element);
- if (!this.settings.messages[element.name] ) {
- this.settings.messages[element.name] = {};
- }
- previous.originalMessage = this.settings.messages[element.name].remote;
- this.settings.messages[element.name].remote = previous.message;
-
- param = typeof param === "string" && {url:param} || param;
-
- if ( previous.old === value ) {
- return previous.valid;
- }
-
- previous.old = value;
- var validator = this;
- this.startRequest(element);
- var data = {};
- data[element.name] = value;
- $.ajax($.extend(true, {
- url: param,
- mode: "abort",
- port: "validate" + element.name,
- dataType: "json",
- data: data,
- success: function( response ) {
- validator.settings.messages[element.name].remote = previous.originalMessage;
- var valid = response === true || response === "true";
- if ( valid ) {
- var submitted = validator.formSubmitted;
- validator.prepareElement(element);
- validator.formSubmitted = submitted;
- validator.successList.push(element);
- delete validator.invalid[element.name];
- validator.showErrors();
- } else {
- var errors = {};
- var message = response || validator.defaultMessage( element, "remote" );
- errors[element.name] = previous.message = $.isFunction(message) ? message(value) : message;
- validator.invalid[element.name] = true;
- validator.showErrors(errors);
- }
- previous.valid = valid;
- validator.stopRequest(element, valid);
- }
- }, param));
- return "pending";
- }
-
- }
-
-});
-
-// deprecated, use $.validator.format instead
-$.format = $.validator.format;
-
-}(jQuery));
-
-// ajax mode: abort
-// usage: $.ajax({ mode: "abort"[, port: "uniqueport"]});
-// if mode:"abort" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort()
-(function($) {
- var pendingRequests = {};
- // Use a prefilter if available (1.5+)
- if ( $.ajaxPrefilter ) {
- $.ajaxPrefilter(function( settings, _, xhr ) {
- var port = settings.port;
- if ( settings.mode === "abort" ) {
- if ( pendingRequests[port] ) {
- pendingRequests[port].abort();
- }
- pendingRequests[port] = xhr;
- }
- });
- } else {
- // Proxy ajax
- var ajax = $.ajax;
- $.ajax = function( settings ) {
- var mode = ( "mode" in settings ? settings : $.ajaxSettings ).mode,
- port = ( "port" in settings ? settings : $.ajaxSettings ).port;
- if ( mode === "abort" ) {
- if ( pendingRequests[port] ) {
- pendingRequests[port].abort();
- }
- pendingRequests[port] = ajax.apply(this, arguments);
- return pendingRequests[port];
- }
- return ajax.apply(this, arguments);
- };
- }
-}(jQuery));
-
-// provides delegate(type: String, delegate: Selector, handler: Callback) plugin for easier event delegation
-// handler is only called when $(event.target).is(delegate), in the scope of the jquery-object for event.target
-(function($) {
- $.extend($.fn, {
- validateDelegate: function( delegate, type, handler ) {
- return this.bind(type, function( event ) {
- var target = $(event.target);
- if ( target.is(delegate) ) {
- return handler.apply(target, arguments);
- }
- });
- }
- });
-}(jQuery));
diff --git a/Fitbit.Portable.DebugSite/Scripts/jquery.validate.min.js b/Fitbit.Portable.DebugSite/Scripts/jquery.validate.min.js
deleted file mode 100644
index cbaf5109..00000000
--- a/Fitbit.Portable.DebugSite/Scripts/jquery.validate.min.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/*! jQuery Validation Plugin - v1.11.1 - 3/22/2013\n* https://github.com/jzaefferer/jquery-validation
-* Copyright (c) 2013 Jörn Zaefferer; Licensed MIT */(function(t){t.extend(t.fn,{validate:function(e){if(!this.length)return e&&e.debug&&window.console&&console.warn("Nothing selected, can't validate, returning nothing."),void 0;var i=t.data(this[0],"validator");return i?i:(this.attr("novalidate","novalidate"),i=new t.validator(e,this[0]),t.data(this[0],"validator",i),i.settings.onsubmit&&(this.validateDelegate(":submit","click",function(e){i.settings.submitHandler&&(i.submitButton=e.target),t(e.target).hasClass("cancel")&&(i.cancelSubmit=!0),void 0!==t(e.target).attr("formnovalidate")&&(i.cancelSubmit=!0)}),this.submit(function(e){function s(){var s;return i.settings.submitHandler?(i.submitButton&&(s=t("
").attr("name",i.submitButton.name).val(t(i.submitButton).val()).appendTo(i.currentForm)),i.settings.submitHandler.call(i,i.currentForm,e),i.submitButton&&s.remove(),!1):!0}return i.settings.debug&&e.preventDefault(),i.cancelSubmit?(i.cancelSubmit=!1,s()):i.form()?i.pendingRequest?(i.formSubmitted=!0,!1):s():(i.focusInvalid(),!1)})),i)},valid:function(){if(t(this[0]).is("form"))return this.validate().form();var e=!0,i=t(this[0].form).validate();return this.each(function(){e=e&&i.element(this)}),e},removeAttrs:function(e){var i={},s=this;return t.each(e.split(/\s/),function(t,e){i[e]=s.attr(e),s.removeAttr(e)}),i},rules:function(e,i){var s=this[0];if(e){var r=t.data(s.form,"validator").settings,n=r.rules,a=t.validator.staticRules(s);switch(e){case"add":t.extend(a,t.validator.normalizeRule(i)),delete a.messages,n[s.name]=a,i.messages&&(r.messages[s.name]=t.extend(r.messages[s.name],i.messages));break;case"remove":if(!i)return delete n[s.name],a;var u={};return t.each(i.split(/\s/),function(t,e){u[e]=a[e],delete a[e]}),u}}var o=t.validator.normalizeRules(t.extend({},t.validator.classRules(s),t.validator.attributeRules(s),t.validator.dataRules(s),t.validator.staticRules(s)),s);if(o.required){var l=o.required;delete o.required,o=t.extend({required:l},o)}return o}}),t.extend(t.expr[":"],{blank:function(e){return!t.trim(""+t(e).val())},filled:function(e){return!!t.trim(""+t(e).val())},unchecked:function(e){return!t(e).prop("checked")}}),t.validator=function(e,i){this.settings=t.extend(!0,{},t.validator.defaults,e),this.currentForm=i,this.init()},t.validator.format=function(e,i){return 1===arguments.length?function(){var i=t.makeArray(arguments);return i.unshift(e),t.validator.format.apply(this,i)}:(arguments.length>2&&i.constructor!==Array&&(i=t.makeArray(arguments).slice(1)),i.constructor!==Array&&(i=[i]),t.each(i,function(t,i){e=e.replace(RegExp("\\{"+t+"\\}","g"),function(){return i})}),e)},t.extend(t.validator,{defaults:{messages:{},groups:{},rules:{},errorClass:"error",validClass:"valid",errorElement:"label",focusInvalid:!0,errorContainer:t([]),errorLabelContainer:t([]),onsubmit:!0,ignore:":hidden",ignoreTitle:!1,onfocusin:function(t){this.lastActive=t,this.settings.focusCleanup&&!this.blockFocusCleanup&&(this.settings.unhighlight&&this.settings.unhighlight.call(this,t,this.settings.errorClass,this.settings.validClass),this.addWrapper(this.errorsFor(t)).hide())},onfocusout:function(t){this.checkable(t)||!(t.name in this.submitted)&&this.optional(t)||this.element(t)},onkeyup:function(t,e){(9!==e.which||""!==this.elementValue(t))&&(t.name in this.submitted||t===this.lastElement)&&this.element(t)},onclick:function(t){t.name in this.submitted?this.element(t):t.parentNode.name in this.submitted&&this.element(t.parentNode)},highlight:function(e,i,s){"radio"===e.type?this.findByName(e.name).addClass(i).removeClass(s):t(e).addClass(i).removeClass(s)},unhighlight:function(e,i,s){"radio"===e.type?this.findByName(e.name).removeClass(i).addClass(s):t(e).removeClass(i).addClass(s)}},setDefaults:function(e){t.extend(t.validator.defaults,e)},messages:{required:"This field is required.",remote:"Please fix this field.",email:"Please enter a valid email address.",url:"Please enter a valid URL.",date:"Please enter a valid date.",dateISO:"Please enter a valid date (ISO).",number:"Please enter a valid number.",digits:"Please enter only digits.",creditcard:"Please enter a valid credit card number.",equalTo:"Please enter the same value again.",maxlength:t.validator.format("Please enter no more than {0} characters."),minlength:t.validator.format("Please enter at least {0} characters."),rangelength:t.validator.format("Please enter a value between {0} and {1} characters long."),range:t.validator.format("Please enter a value between {0} and {1}."),max:t.validator.format("Please enter a value less than or equal to {0}."),min:t.validator.format("Please enter a value greater than or equal to {0}.")},autoCreateRanges:!1,prototype:{init:function(){function e(e){var i=t.data(this[0].form,"validator"),s="on"+e.type.replace(/^validate/,"");i.settings[s]&&i.settings[s].call(i,this[0],e)}this.labelContainer=t(this.settings.errorLabelContainer),this.errorContext=this.labelContainer.length&&this.labelContainer||t(this.currentForm),this.containers=t(this.settings.errorContainer).add(this.settings.errorLabelContainer),this.submitted={},this.valueCache={},this.pendingRequest=0,this.pending={},this.invalid={},this.reset();var i=this.groups={};t.each(this.settings.groups,function(e,s){"string"==typeof s&&(s=s.split(/\s/)),t.each(s,function(t,s){i[s]=e})});var s=this.settings.rules;t.each(s,function(e,i){s[e]=t.validator.normalizeRule(i)}),t(this.currentForm).validateDelegate(":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'] ,[type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], [type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'] ","focusin focusout keyup",e).validateDelegate("[type='radio'], [type='checkbox'], select, option","click",e),this.settings.invalidHandler&&t(this.currentForm).bind("invalid-form.validate",this.settings.invalidHandler)},form:function(){return this.checkForm(),t.extend(this.submitted,this.errorMap),this.invalid=t.extend({},this.errorMap),this.valid()||t(this.currentForm).triggerHandler("invalid-form",[this]),this.showErrors(),this.valid()},checkForm:function(){this.prepareForm();for(var t=0,e=this.currentElements=this.elements();e[t];t++)this.check(e[t]);return this.valid()},element:function(e){e=this.validationTargetFor(this.clean(e)),this.lastElement=e,this.prepareElement(e),this.currentElements=t(e);var i=this.check(e)!==!1;return i?delete this.invalid[e.name]:this.invalid[e.name]=!0,this.numberOfInvalids()||(this.toHide=this.toHide.add(this.containers)),this.showErrors(),i},showErrors:function(e){if(e){t.extend(this.errorMap,e),this.errorList=[];for(var i in e)this.errorList.push({message:e[i],element:this.findByName(i)[0]});this.successList=t.grep(this.successList,function(t){return!(t.name in e)})}this.settings.showErrors?this.settings.showErrors.call(this,this.errorMap,this.errorList):this.defaultShowErrors()},resetForm:function(){t.fn.resetForm&&t(this.currentForm).resetForm(),this.submitted={},this.lastElement=null,this.prepareForm(),this.hideErrors(),this.elements().removeClass(this.settings.errorClass).removeData("previousValue")},numberOfInvalids:function(){return this.objectLength(this.invalid)},objectLength:function(t){var e=0;for(var i in t)e++;return e},hideErrors:function(){this.addWrapper(this.toHide).hide()},valid:function(){return 0===this.size()},size:function(){return this.errorList.length},focusInvalid:function(){if(this.settings.focusInvalid)try{t(this.findLastActive()||this.errorList.length&&this.errorList[0].element||[]).filter(":visible").focus().trigger("focusin")}catch(e){}},findLastActive:function(){var e=this.lastActive;return e&&1===t.grep(this.errorList,function(t){return t.element.name===e.name}).length&&e},elements:function(){var e=this,i={};return t(this.currentForm).find("input, select, textarea").not(":submit, :reset, :image, [disabled]").not(this.settings.ignore).filter(function(){return!this.name&&e.settings.debug&&window.console&&console.error("%o has no name assigned",this),this.name in i||!e.objectLength(t(this).rules())?!1:(i[this.name]=!0,!0)})},clean:function(e){return t(e)[0]},errors:function(){var e=this.settings.errorClass.replace(" ",".");return t(this.settings.errorElement+"."+e,this.errorContext)},reset:function(){this.successList=[],this.errorList=[],this.errorMap={},this.toShow=t([]),this.toHide=t([]),this.currentElements=t([])},prepareForm:function(){this.reset(),this.toHide=this.errors().add(this.containers)},prepareElement:function(t){this.reset(),this.toHide=this.errorsFor(t)},elementValue:function(e){var i=t(e).attr("type"),s=t(e).val();return"radio"===i||"checkbox"===i?t("input[name='"+t(e).attr("name")+"']:checked").val():"string"==typeof s?s.replace(/\r/g,""):s},check:function(e){e=this.validationTargetFor(this.clean(e));var i,s=t(e).rules(),r=!1,n=this.elementValue(e);for(var a in s){var u={method:a,parameters:s[a]};try{if(i=t.validator.methods[a].call(this,n,e,u.parameters),"dependency-mismatch"===i){r=!0;continue}if(r=!1,"pending"===i)return this.toHide=this.toHide.not(this.errorsFor(e)),void 0;if(!i)return this.formatAndAdd(e,u),!1}catch(o){throw this.settings.debug&&window.console&&console.log("Exception occurred when checking element "+e.id+", check the '"+u.method+"' method.",o),o}}return r?void 0:(this.objectLength(s)&&this.successList.push(e),!0)},customDataMessage:function(e,i){return t(e).data("msg-"+i.toLowerCase())||e.attributes&&t(e).attr("data-msg-"+i.toLowerCase())},customMessage:function(t,e){var i=this.settings.messages[t];return i&&(i.constructor===String?i:i[e])},findDefined:function(){for(var t=0;arguments.length>t;t++)if(void 0!==arguments[t])return arguments[t];return void 0},defaultMessage:function(e,i){return this.findDefined(this.customMessage(e.name,i),this.customDataMessage(e,i),!this.settings.ignoreTitle&&e.title||void 0,t.validator.messages[i],"
Warning: No message defined for "+e.name+"")},formatAndAdd:function(e,i){var s=this.defaultMessage(e,i.method),r=/\$?\{(\d+)\}/g;"function"==typeof s?s=s.call(this,i.parameters,e):r.test(s)&&(s=t.validator.format(s.replace(r,"{$1}"),i.parameters)),this.errorList.push({message:s,element:e}),this.errorMap[e.name]=s,this.submitted[e.name]=s},addWrapper:function(t){return this.settings.wrapper&&(t=t.add(t.parent(this.settings.wrapper))),t},defaultShowErrors:function(){var t,e;for(t=0;this.errorList[t];t++){var i=this.errorList[t];this.settings.highlight&&this.settings.highlight.call(this,i.element,this.settings.errorClass,this.settings.validClass),this.showLabel(i.element,i.message)}if(this.errorList.length&&(this.toShow=this.toShow.add(this.containers)),this.settings.success)for(t=0;this.successList[t];t++)this.showLabel(this.successList[t]);if(this.settings.unhighlight)for(t=0,e=this.validElements();e[t];t++)this.settings.unhighlight.call(this,e[t],this.settings.errorClass,this.settings.validClass);this.toHide=this.toHide.not(this.toShow),this.hideErrors(),this.addWrapper(this.toShow).show()},validElements:function(){return this.currentElements.not(this.invalidElements())},invalidElements:function(){return t(this.errorList).map(function(){return this.element})},showLabel:function(e,i){var s=this.errorsFor(e);s.length?(s.removeClass(this.settings.validClass).addClass(this.settings.errorClass),s.html(i)):(s=t("<"+this.settings.errorElement+">").attr("for",this.idOrName(e)).addClass(this.settings.errorClass).html(i||""),this.settings.wrapper&&(s=s.hide().show().wrap("<"+this.settings.wrapper+"/>").parent()),this.labelContainer.append(s).length||(this.settings.errorPlacement?this.settings.errorPlacement(s,t(e)):s.insertAfter(e))),!i&&this.settings.success&&(s.text(""),"string"==typeof this.settings.success?s.addClass(this.settings.success):this.settings.success(s,e)),this.toShow=this.toShow.add(s)},errorsFor:function(e){var i=this.idOrName(e);return this.errors().filter(function(){return t(this).attr("for")===i})},idOrName:function(t){return this.groups[t.name]||(this.checkable(t)?t.name:t.id||t.name)},validationTargetFor:function(t){return this.checkable(t)&&(t=this.findByName(t.name).not(this.settings.ignore)[0]),t},checkable:function(t){return/radio|checkbox/i.test(t.type)},findByName:function(e){return t(this.currentForm).find("[name='"+e+"']")},getLength:function(e,i){switch(i.nodeName.toLowerCase()){case"select":return t("option:selected",i).length;case"input":if(this.checkable(i))return this.findByName(i.name).filter(":checked").length}return e.length},depend:function(t,e){return this.dependTypes[typeof t]?this.dependTypes[typeof t](t,e):!0},dependTypes:{"boolean":function(t){return t},string:function(e,i){return!!t(e,i.form).length},"function":function(t,e){return t(e)}},optional:function(e){var i=this.elementValue(e);return!t.validator.methods.required.call(this,i,e)&&"dependency-mismatch"},startRequest:function(t){this.pending[t.name]||(this.pendingRequest++,this.pending[t.name]=!0)},stopRequest:function(e,i){this.pendingRequest--,0>this.pendingRequest&&(this.pendingRequest=0),delete this.pending[e.name],i&&0===this.pendingRequest&&this.formSubmitted&&this.form()?(t(this.currentForm).submit(),this.formSubmitted=!1):!i&&0===this.pendingRequest&&this.formSubmitted&&(t(this.currentForm).triggerHandler("invalid-form",[this]),this.formSubmitted=!1)},previousValue:function(e){return t.data(e,"previousValue")||t.data(e,"previousValue",{old:null,valid:!0,message:this.defaultMessage(e,"remote")})}},classRuleSettings:{required:{required:!0},email:{email:!0},url:{url:!0},date:{date:!0},dateISO:{dateISO:!0},number:{number:!0},digits:{digits:!0},creditcard:{creditcard:!0}},addClassRules:function(e,i){e.constructor===String?this.classRuleSettings[e]=i:t.extend(this.classRuleSettings,e)},classRules:function(e){var i={},s=t(e).attr("class");return s&&t.each(s.split(" "),function(){this in t.validator.classRuleSettings&&t.extend(i,t.validator.classRuleSettings[this])}),i},attributeRules:function(e){var i={},s=t(e),r=s[0].getAttribute("type");for(var n in t.validator.methods){var a;"required"===n?(a=s.get(0).getAttribute(n),""===a&&(a=!0),a=!!a):a=s.attr(n),/min|max/.test(n)&&(null===r||/number|range|text/.test(r))&&(a=Number(a)),a?i[n]=a:r===n&&"range"!==r&&(i[n]=!0)}return i.maxlength&&/-1|2147483647|524288/.test(i.maxlength)&&delete i.maxlength,i},dataRules:function(e){var i,s,r={},n=t(e);for(i in t.validator.methods)s=n.data("rule-"+i.toLowerCase()),void 0!==s&&(r[i]=s);return r},staticRules:function(e){var i={},s=t.data(e.form,"validator");return s.settings.rules&&(i=t.validator.normalizeRule(s.settings.rules[e.name])||{}),i},normalizeRules:function(e,i){return t.each(e,function(s,r){if(r===!1)return delete e[s],void 0;if(r.param||r.depends){var n=!0;switch(typeof r.depends){case"string":n=!!t(r.depends,i.form).length;break;case"function":n=r.depends.call(i,i)}n?e[s]=void 0!==r.param?r.param:!0:delete e[s]}}),t.each(e,function(s,r){e[s]=t.isFunction(r)?r(i):r}),t.each(["minlength","maxlength"],function(){e[this]&&(e[this]=Number(e[this]))}),t.each(["rangelength","range"],function(){var i;e[this]&&(t.isArray(e[this])?e[this]=[Number(e[this][0]),Number(e[this][1])]:"string"==typeof e[this]&&(i=e[this].split(/[\s,]+/),e[this]=[Number(i[0]),Number(i[1])]))}),t.validator.autoCreateRanges&&(e.min&&e.max&&(e.range=[e.min,e.max],delete e.min,delete e.max),e.minlength&&e.maxlength&&(e.rangelength=[e.minlength,e.maxlength],delete e.minlength,delete e.maxlength)),e},normalizeRule:function(e){if("string"==typeof e){var i={};t.each(e.split(/\s/),function(){i[this]=!0}),e=i}return e},addMethod:function(e,i,s){t.validator.methods[e]=i,t.validator.messages[e]=void 0!==s?s:t.validator.messages[e],3>i.length&&t.validator.addClassRules(e,t.validator.normalizeRule(e))},methods:{required:function(e,i,s){if(!this.depend(s,i))return"dependency-mismatch";if("select"===i.nodeName.toLowerCase()){var r=t(i).val();return r&&r.length>0}return this.checkable(i)?this.getLength(e,i)>0:t.trim(e).length>0},email:function(t,e){return this.optional(e)||/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i.test(t)},url:function(t,e){return this.optional(e)||/^(https?|s?ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(t)},date:function(t,e){return this.optional(e)||!/Invalid|NaN/.test(""+new Date(t))},dateISO:function(t,e){return this.optional(e)||/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/.test(t)},number:function(t,e){return this.optional(e)||/^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(t)},digits:function(t,e){return this.optional(e)||/^\d+$/.test(t)},creditcard:function(t,e){if(this.optional(e))return"dependency-mismatch";if(/[^0-9 \-]+/.test(t))return!1;var i=0,s=0,r=!1;t=t.replace(/\D/g,"");for(var n=t.length-1;n>=0;n--){var a=t.charAt(n);s=parseInt(a,10),r&&(s*=2)>9&&(s-=9),i+=s,r=!r}return 0===i%10},minlength:function(e,i,s){var r=t.isArray(e)?e.length:this.getLength(t.trim(e),i);return this.optional(i)||r>=s},maxlength:function(e,i,s){var r=t.isArray(e)?e.length:this.getLength(t.trim(e),i);return this.optional(i)||s>=r},rangelength:function(e,i,s){var r=t.isArray(e)?e.length:this.getLength(t.trim(e),i);return this.optional(i)||r>=s[0]&&s[1]>=r},min:function(t,e,i){return this.optional(e)||t>=i},max:function(t,e,i){return this.optional(e)||i>=t},range:function(t,e,i){return this.optional(e)||t>=i[0]&&i[1]>=t},equalTo:function(e,i,s){var r=t(s);return this.settings.onfocusout&&r.unbind(".validate-equalTo").bind("blur.validate-equalTo",function(){t(i).valid()}),e===r.val()},remote:function(e,i,s){if(this.optional(i))return"dependency-mismatch";var r=this.previousValue(i);if(this.settings.messages[i.name]||(this.settings.messages[i.name]={}),r.originalMessage=this.settings.messages[i.name].remote,this.settings.messages[i.name].remote=r.message,s="string"==typeof s&&{url:s}||s,r.old===e)return r.valid;r.old=e;var n=this;this.startRequest(i);var a={};return a[i.name]=e,t.ajax(t.extend(!0,{url:s,mode:"abort",port:"validate"+i.name,dataType:"json",data:a,success:function(s){n.settings.messages[i.name].remote=r.originalMessage;var a=s===!0||"true"===s;if(a){var u=n.formSubmitted;n.prepareElement(i),n.formSubmitted=u,n.successList.push(i),delete n.invalid[i.name],n.showErrors()}else{var o={},l=s||n.defaultMessage(i,"remote");o[i.name]=r.message=t.isFunction(l)?l(e):l,n.invalid[i.name]=!0,n.showErrors(o)}r.valid=a,n.stopRequest(i,a)}},s)),"pending"}}}),t.format=t.validator.format})(jQuery),function(t){var e={};if(t.ajaxPrefilter)t.ajaxPrefilter(function(t,i,s){var r=t.port;"abort"===t.mode&&(e[r]&&e[r].abort(),e[r]=s)});else{var i=t.ajax;t.ajax=function(s){var r=("mode"in s?s:t.ajaxSettings).mode,n=("port"in s?s:t.ajaxSettings).port;return"abort"===r?(e[n]&&e[n].abort(),e[n]=i.apply(this,arguments),e[n]):i.apply(this,arguments)}}}(jQuery),function(t){t.extend(t.fn,{validateDelegate:function(e,i,s){return this.bind(i,function(i){var r=t(i.target);return r.is(e)?s.apply(r,arguments):void 0})}})}(jQuery);
\ No newline at end of file
diff --git a/Fitbit.Portable.DebugSite/Scripts/jquery.validate.unobtrusive.js b/Fitbit.Portable.DebugSite/Scripts/jquery.validate.unobtrusive.js
deleted file mode 100644
index 3d117943..00000000
--- a/Fitbit.Portable.DebugSite/Scripts/jquery.validate.unobtrusive.js
+++ /dev/null
@@ -1,410 +0,0 @@
-/* NUGET: BEGIN LICENSE TEXT
- *
- * Microsoft grants you the right to use these script files for the sole
- * purpose of either: (i) interacting through your browser with the Microsoft
- * website or online service, subject to the applicable licensing or use
- * terms; or (ii) using the files as included with a Microsoft product subject
- * to that product's license terms. Microsoft reserves all other rights to the
- * files not expressly granted by Microsoft, whether by implication, estoppel
- * or otherwise. Insofar as a script file is dual licensed under GPL,
- * Microsoft neither took the code under GPL nor distributes it thereunder but
- * under the terms set out in this paragraph. All notices and licenses
- * below are for informational purposes only.
- *
- * NUGET: END LICENSE TEXT */
-/*!
-** Unobtrusive validation support library for jQuery and jQuery Validate
-** Copyright (C) Microsoft Corporation. All rights reserved.
-*/
-
-/*jslint white: true, browser: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: true, newcap: true, immed: true, strict: false */
-/*global document: false, jQuery: false */
-
-(function ($) {
- var $jQval = $.validator,
- adapters,
- data_validation = "unobtrusiveValidation";
-
- function setValidationValues(options, ruleName, value) {
- options.rules[ruleName] = value;
- if (options.message) {
- options.messages[ruleName] = options.message;
- }
- }
-
- function splitAndTrim(value) {
- return value.replace(/^\s+|\s+$/g, "").split(/\s*,\s*/g);
- }
-
- function escapeAttributeValue(value) {
- // As mentioned on http://api.jquery.com/category/selectors/
- return value.replace(/([!"#$%&'()*+,./:;<=>?@\[\\\]^`{|}~])/g, "\\$1");
- }
-
- function getModelPrefix(fieldName) {
- return fieldName.substr(0, fieldName.lastIndexOf(".") + 1);
- }
-
- function appendModelPrefix(value, prefix) {
- if (value.indexOf("*.") === 0) {
- value = value.replace("*.", prefix);
- }
- return value;
- }
-
- function onError(error, inputElement) { // 'this' is the form element
- var container = $(this).find("[data-valmsg-for='" + escapeAttributeValue(inputElement[0].name) + "']"),
- replaceAttrValue = container.attr("data-valmsg-replace"),
- replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) !== false : null;
-
- container.removeClass("field-validation-valid").addClass("field-validation-error");
- error.data("unobtrusiveContainer", container);
-
- if (replace) {
- container.empty();
- error.removeClass("input-validation-error").appendTo(container);
- }
- else {
- error.hide();
- }
- }
-
- function onErrors(event, validator) { // 'this' is the form element
- var container = $(this).find("[data-valmsg-summary=true]"),
- list = container.find("ul");
-
- if (list && list.length && validator.errorList.length) {
- list.empty();
- container.addClass("validation-summary-errors").removeClass("validation-summary-valid");
-
- $.each(validator.errorList, function () {
- $("
").html(this.message).appendTo(list);
- });
- }
- }
-
- function onSuccess(error) { // 'this' is the form element
- var container = error.data("unobtrusiveContainer"),
- replaceAttrValue = container.attr("data-valmsg-replace"),
- replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) : null;
-
- if (container) {
- container.addClass("field-validation-valid").removeClass("field-validation-error");
- error.removeData("unobtrusiveContainer");
-
- if (replace) {
- container.empty();
- }
- }
- }
-
- function onReset(event) { // 'this' is the form element
- var $form = $(this);
- $form.data("validator").resetForm();
- $form.find(".validation-summary-errors")
- .addClass("validation-summary-valid")
- .removeClass("validation-summary-errors");
- $form.find(".field-validation-error")
- .addClass("field-validation-valid")
- .removeClass("field-validation-error")
- .removeData("unobtrusiveContainer")
- .find(">*") // If we were using valmsg-replace, get the underlying error
- .removeData("unobtrusiveContainer");
- }
-
- function validationInfo(form) {
- var $form = $(form),
- result = $form.data(data_validation),
- onResetProxy = $.proxy(onReset, form),
- defaultOptions = $jQval.unobtrusive.options || {},
- execInContext = function (name, args) {
- var func = defaultOptions[name];
- func && $.isFunction(func) && func.apply(form, args);
- }
-
- if (!result) {
- result = {
- options: { // options structure passed to jQuery Validate's validate() method
- errorClass: defaultOptions.errorClass || "input-validation-error",
- errorElement: defaultOptions.errorElement || "span",
- errorPlacement: function () {
- onError.apply(form, arguments);
- execInContext("errorPlacement", arguments);
- },
- invalidHandler: function () {
- onErrors.apply(form, arguments);
- execInContext("invalidHandler", arguments);
- },
- messages: {},
- rules: {},
- success: function () {
- onSuccess.apply(form, arguments);
- execInContext("success", arguments);
- }
- },
- attachValidation: function () {
- $form
- .off("reset." + data_validation, onResetProxy)
- .on("reset." + data_validation, onResetProxy)
- .validate(this.options);
- },
- validate: function () { // a validation function that is called by unobtrusive Ajax
- $form.validate();
- return $form.valid();
- }
- };
- $form.data(data_validation, result);
- }
-
- return result;
- }
-
- $jQval.unobtrusive = {
- adapters: [],
-
- parseElement: function (element, skipAttach) {
- ///
- /// Parses a single HTML element for unobtrusive validation attributes.
- ///
- ///
The HTML element to be parsed.
- ///
[Optional] true to skip attaching the
- /// validation to the form. If parsing just this single element, you should specify true.
- /// If parsing several elements, you should specify false, and manually attach the validation
- /// to the form when you are finished. The default is false.
- var $element = $(element),
- form = $element.parents("form")[0],
- valInfo, rules, messages;
-
- if (!form) { // Cannot do client-side validation without a form
- return;
- }
-
- valInfo = validationInfo(form);
- valInfo.options.rules[element.name] = rules = {};
- valInfo.options.messages[element.name] = messages = {};
-
- $.each(this.adapters, function () {
- var prefix = "data-val-" + this.name,
- message = $element.attr(prefix),
- paramValues = {};
-
- if (message !== undefined) { // Compare against undefined, because an empty message is legal (and falsy)
- prefix += "-";
-
- $.each(this.params, function () {
- paramValues[this] = $element.attr(prefix + this);
- });
-
- this.adapt({
- element: element,
- form: form,
- message: message,
- params: paramValues,
- rules: rules,
- messages: messages
- });
- }
- });
-
- $.extend(rules, { "__dummy__": true });
-
- if (!skipAttach) {
- valInfo.attachValidation();
- }
- },
-
- parse: function (selector) {
- ///
- /// Parses all the HTML elements in the specified selector. It looks for input elements decorated
- /// with the [data-val=true] attribute value and enables validation according to the data-val-*
- /// attribute values.
- ///
- ///
Any valid jQuery selector.
-
- // $forms includes all forms in selector's DOM hierarchy (parent, children and self) that have at least one
- // element with data-val=true
- var $selector = $(selector),
- $forms = $selector.parents()
- .addBack()
- .filter("form")
- .add($selector.find("form"))
- .has("[data-val=true]");
-
- $selector.find("[data-val=true]").each(function () {
- $jQval.unobtrusive.parseElement(this, true);
- });
-
- $forms.each(function () {
- var info = validationInfo(this);
- if (info) {
- info.attachValidation();
- }
- });
- }
- };
-
- adapters = $jQval.unobtrusive.adapters;
-
- adapters.add = function (adapterName, params, fn) {
- ///
Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation.
- ///
The name of the adapter to be added. This matches the name used
- /// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).
- ///
[Optional] An array of parameter names (strings) that will
- /// be extracted from the data-val-nnnn-mmmm HTML attributes (where nnnn is the adapter name, and
- /// mmmm is the parameter name).
- ///
The function to call, which adapts the values from the HTML
- /// attributes into jQuery Validate rules and/or messages.
- ///
- if (!fn) { // Called with no params, just a function
- fn = params;
- params = [];
- }
- this.push({ name: adapterName, params: params, adapt: fn });
- return this;
- };
-
- adapters.addBool = function (adapterName, ruleName) {
- ///
Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where
- /// the jQuery Validate validation rule has no parameter values.
- ///
The name of the adapter to be added. This matches the name used
- /// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).
- ///
[Optional] The name of the jQuery Validate rule. If not provided, the value
- /// of adapterName will be used instead.
- ///
- return this.add(adapterName, function (options) {
- setValidationValues(options, ruleName || adapterName, true);
- });
- };
-
- adapters.addMinMax = function (adapterName, minRuleName, maxRuleName, minMaxRuleName, minAttribute, maxAttribute) {
- ///
Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where
- /// the jQuery Validate validation has three potential rules (one for min-only, one for max-only, and
- /// one for min-and-max). The HTML parameters are expected to be named -min and -max.
- ///
The name of the adapter to be added. This matches the name used
- /// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).
- ///
The name of the jQuery Validate rule to be used when you only
- /// have a minimum value.
- ///
The name of the jQuery Validate rule to be used when you only
- /// have a maximum value.
- ///
The name of the jQuery Validate rule to be used when you
- /// have both a minimum and maximum value.
- ///
[Optional] The name of the HTML attribute that
- /// contains the minimum value. The default is "min".
- ///
[Optional] The name of the HTML attribute that
- /// contains the maximum value. The default is "max".
- ///
- return this.add(adapterName, [minAttribute || "min", maxAttribute || "max"], function (options) {
- var min = options.params.min,
- max = options.params.max;
-
- if (min && max) {
- setValidationValues(options, minMaxRuleName, [min, max]);
- }
- else if (min) {
- setValidationValues(options, minRuleName, min);
- }
- else if (max) {
- setValidationValues(options, maxRuleName, max);
- }
- });
- };
-
- adapters.addSingleVal = function (adapterName, attribute, ruleName) {
- ///
Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where
- /// the jQuery Validate validation rule has a single value.
- ///
The name of the adapter to be added. This matches the name used
- /// in the data-val-nnnn HTML attribute(where nnnn is the adapter name).
- ///
[Optional] The name of the HTML attribute that contains the value.
- /// The default is "val".
- ///
[Optional] The name of the jQuery Validate rule. If not provided, the value
- /// of adapterName will be used instead.
- ///
- return this.add(adapterName, [attribute || "val"], function (options) {
- setValidationValues(options, ruleName || adapterName, options.params[attribute]);
- });
- };
-
- $jQval.addMethod("__dummy__", function (value, element, params) {
- return true;
- });
-
- $jQval.addMethod("regex", function (value, element, params) {
- var match;
- if (this.optional(element)) {
- return true;
- }
-
- match = new RegExp(params).exec(value);
- return (match && (match.index === 0) && (match[0].length === value.length));
- });
-
- $jQval.addMethod("nonalphamin", function (value, element, nonalphamin) {
- var match;
- if (nonalphamin) {
- match = value.match(/\W/g);
- match = match && match.length >= nonalphamin;
- }
- return match;
- });
-
- if ($jQval.methods.extension) {
- adapters.addSingleVal("accept", "mimtype");
- adapters.addSingleVal("extension", "extension");
- } else {
- // for backward compatibility, when the 'extension' validation method does not exist, such as with versions
- // of JQuery Validation plugin prior to 1.10, we should use the 'accept' method for
- // validating the extension, and ignore mime-type validations as they are not supported.
- adapters.addSingleVal("extension", "extension", "accept");
- }
-
- adapters.addSingleVal("regex", "pattern");
- adapters.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url");
- adapters.addMinMax("length", "minlength", "maxlength", "rangelength").addMinMax("range", "min", "max", "range");
- adapters.addMinMax("minlength", "minlength").addMinMax("maxlength", "minlength", "maxlength");
- adapters.add("equalto", ["other"], function (options) {
- var prefix = getModelPrefix(options.element.name),
- other = options.params.other,
- fullOtherName = appendModelPrefix(other, prefix),
- element = $(options.form).find(":input").filter("[name='" + escapeAttributeValue(fullOtherName) + "']")[0];
-
- setValidationValues(options, "equalTo", element);
- });
- adapters.add("required", function (options) {
- // jQuery Validate equates "required" with "mandatory" for checkbox elements
- if (options.element.tagName.toUpperCase() !== "INPUT" || options.element.type.toUpperCase() !== "CHECKBOX") {
- setValidationValues(options, "required", true);
- }
- });
- adapters.add("remote", ["url", "type", "additionalfields"], function (options) {
- var value = {
- url: options.params.url,
- type: options.params.type || "GET",
- data: {}
- },
- prefix = getModelPrefix(options.element.name);
-
- $.each(splitAndTrim(options.params.additionalfields || options.element.name), function (i, fieldName) {
- var paramName = appendModelPrefix(fieldName, prefix);
- value.data[paramName] = function () {
- return $(options.form).find(":input").filter("[name='" + escapeAttributeValue(paramName) + "']").val();
- };
- });
-
- setValidationValues(options, "remote", value);
- });
- adapters.add("password", ["min", "nonalphamin", "regex"], function (options) {
- if (options.params.min) {
- setValidationValues(options, "minlength", options.params.min);
- }
- if (options.params.nonalphamin) {
- setValidationValues(options, "nonalphamin", options.params.nonalphamin);
- }
- if (options.params.regex) {
- setValidationValues(options, "regex", options.params.regex);
- }
- });
-
- $(function () {
- $jQval.unobtrusive.parse(document);
- });
-}(jQuery));
\ No newline at end of file
diff --git a/Fitbit.Portable.DebugSite/Scripts/jquery.validate.unobtrusive.min.js b/Fitbit.Portable.DebugSite/Scripts/jquery.validate.unobtrusive.min.js
deleted file mode 100644
index db91044e..00000000
--- a/Fitbit.Portable.DebugSite/Scripts/jquery.validate.unobtrusive.min.js
+++ /dev/null
@@ -1,19 +0,0 @@
-/* NUGET: BEGIN LICENSE TEXT
- *
- * Microsoft grants you the right to use these script files for the sole
- * purpose of either: (i) interacting through your browser with the Microsoft
- * website or online service, subject to the applicable licensing or use
- * terms; or (ii) using the files as included with a Microsoft product subject
- * to that product's license terms. Microsoft reserves all other rights to the
- * files not expressly granted by Microsoft, whether by implication, estoppel
- * or otherwise. Insofar as a script file is dual licensed under GPL,
- * Microsoft neither took the code under GPL nor distributes it thereunder but
- * under the terms set out in this paragraph. All notices and licenses
- * below are for informational purposes only.
- *
- * NUGET: END LICENSE TEXT */
-/*
-** Unobtrusive validation support library for jQuery and jQuery Validate
-** Copyright (C) Microsoft Corporation. All rights reserved.
-*/
-(function(a){var d=a.validator,b,e="unobtrusiveValidation";function c(a,b,c){a.rules[b]=c;if(a.message)a.messages[b]=a.message}function j(a){return a.replace(/^\s+|\s+$/g,"").split(/\s*,\s*/g)}function f(a){return a.replace(/([!"#$%&'()*+,./:;<=>?@\[\\\]^`{|}~])/g,"\\$1")}function h(a){return a.substr(0,a.lastIndexOf(".")+1)}function g(a,b){if(a.indexOf("*.")===0)a=a.replace("*.",b);return a}function m(c,e){var b=a(this).find("[data-valmsg-for='"+f(e[0].name)+"']"),d=b.attr("data-valmsg-replace"),g=d?a.parseJSON(d)!==false:null;b.removeClass("field-validation-valid").addClass("field-validation-error");c.data("unobtrusiveContainer",b);if(g){b.empty();c.removeClass("input-validation-error").appendTo(b)}else c.hide()}function l(e,d){var c=a(this).find("[data-valmsg-summary=true]"),b=c.find("ul");if(b&&b.length&&d.errorList.length){b.empty();c.addClass("validation-summary-errors").removeClass("validation-summary-valid");a.each(d.errorList,function(){a("
").html(this.message).appendTo(b)})}}function k(d){var b=d.data("unobtrusiveContainer"),c=b.attr("data-valmsg-replace"),e=c?a.parseJSON(c):null;if(b){b.addClass("field-validation-valid").removeClass("field-validation-error");d.removeData("unobtrusiveContainer");e&&b.empty()}}function n(){var b=a(this);b.data("validator").resetForm();b.find(".validation-summary-errors").addClass("validation-summary-valid").removeClass("validation-summary-errors");b.find(".field-validation-error").addClass("field-validation-valid").removeClass("field-validation-error").removeData("unobtrusiveContainer").find(">*").removeData("unobtrusiveContainer")}function i(b){var c=a(b),f=c.data(e),i=a.proxy(n,b),g=d.unobtrusive.options||{},h=function(e,d){var c=g[e];c&&a.isFunction(c)&&c.apply(b,d)};if(!f){f={options:{errorClass:g.errorClass||"input-validation-error",errorElement:g.errorElement||"span",errorPlacement:function(){m.apply(b,arguments);h("errorPlacement",arguments)},invalidHandler:function(){l.apply(b,arguments);h("invalidHandler",arguments)},messages:{},rules:{},success:function(){k.apply(b,arguments);h("success",arguments)}},attachValidation:function(){c.off("reset."+e,i).on("reset."+e,i).validate(this.options)},validate:function(){c.validate();return c.valid()}};c.data(e,f)}return f}d.unobtrusive={adapters:[],parseElement:function(b,h){var d=a(b),f=d.parents("form")[0],c,e,g;if(!f)return;c=i(f);c.options.rules[b.name]=e={};c.options.messages[b.name]=g={};a.each(this.adapters,function(){var c="data-val-"+this.name,i=d.attr(c),h={};if(i!==undefined){c+="-";a.each(this.params,function(){h[this]=d.attr(c+this)});this.adapt({element:b,form:f,message:i,params:h,rules:e,messages:g})}});a.extend(e,{__dummy__:true});!h&&c.attachValidation()},parse:function(c){var b=a(c),e=b.parents().addBack().filter("form").add(b.find("form")).has("[data-val=true]");b.find("[data-val=true]").each(function(){d.unobtrusive.parseElement(this,true)});e.each(function(){var a=i(this);a&&a.attachValidation()})}};b=d.unobtrusive.adapters;b.add=function(c,a,b){if(!b){b=a;a=[]}this.push({name:c,params:a,adapt:b});return this};b.addBool=function(a,b){return this.add(a,function(d){c(d,b||a,true)})};b.addMinMax=function(e,g,f,a,d,b){return this.add(e,[d||"min",b||"max"],function(b){var e=b.params.min,d=b.params.max;if(e&&d)c(b,a,[e,d]);else if(e)c(b,g,e);else d&&c(b,f,d)})};b.addSingleVal=function(a,b,d){return this.add(a,[b||"val"],function(e){c(e,d||a,e.params[b])})};d.addMethod("__dummy__",function(){return true});d.addMethod("regex",function(b,c,d){var a;if(this.optional(c))return true;a=(new RegExp(d)).exec(b);return a&&a.index===0&&a[0].length===b.length});d.addMethod("nonalphamin",function(c,d,b){var a;if(b){a=c.match(/\W/g);a=a&&a.length>=b}return a});if(d.methods.extension){b.addSingleVal("accept","mimtype");b.addSingleVal("extension","extension")}else b.addSingleVal("extension","extension","accept");b.addSingleVal("regex","pattern");b.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url");b.addMinMax("length","minlength","maxlength","rangelength").addMinMax("range","min","max","range");b.addMinMax("minlength","minlength").addMinMax("maxlength","minlength","maxlength");b.add("equalto",["other"],function(b){var i=h(b.element.name),j=b.params.other,d=g(j,i),e=a(b.form).find(":input").filter("[name='"+f(d)+"']")[0];c(b,"equalTo",e)});b.add("required",function(a){(a.element.tagName.toUpperCase()!=="INPUT"||a.element.type.toUpperCase()!=="CHECKBOX")&&c(a,"required",true)});b.add("remote",["url","type","additionalfields"],function(b){var d={url:b.params.url,type:b.params.type||"GET",data:{}},e=h(b.element.name);a.each(j(b.params.additionalfields||b.element.name),function(i,h){var c=g(h,e);d.data[c]=function(){return a(b.form).find(":input").filter("[name='"+f(c)+"']").val()}});c(b,"remote",d)});b.add("password",["min","nonalphamin","regex"],function(a){a.params.min&&c(a,"minlength",a.params.min);a.params.nonalphamin&&c(a,"nonalphamin",a.params.nonalphamin);a.params.regex&&c(a,"regex",a.params.regex)});a(function(){d.unobtrusive.parse(document)})})(jQuery);
\ No newline at end of file
diff --git a/Fitbit.Portable.DebugSite/Scripts/modernizr-2.6.2.js b/Fitbit.Portable.DebugSite/Scripts/modernizr-2.6.2.js
deleted file mode 100644
index 56a00220..00000000
--- a/Fitbit.Portable.DebugSite/Scripts/modernizr-2.6.2.js
+++ /dev/null
@@ -1,1393 +0,0 @@
-/*!
- * Modernizr v2.6.2
- * www.modernizr.com
- *
- * Copyright (c) Faruk Ates, Paul Irish, Alex Sexton
- * Available under the BSD and MIT licenses: www.modernizr.com/license/
- */
-
-/*
- * Modernizr tests which native CSS3 and HTML5 features are available in
- * the current UA and makes the results available to you in two ways:
- * as properties on a global Modernizr object, and as classes on the
- * element. This information allows you to progressively enhance
- * your pages with a granular level of control over the experience.
- *
- * Modernizr has an optional (not included) conditional resource loader
- * called Modernizr.load(), based on Yepnope.js (yepnopejs.com).
- * To get a build that includes Modernizr.load(), as well as choosing
- * which tests to include, go to www.modernizr.com/download/
- *
- * Authors Faruk Ates, Paul Irish, Alex Sexton
- * Contributors Ryan Seddon, Ben Alman
- */
-
-window.Modernizr = (function( window, document, undefined ) {
-
- var version = '2.6.2',
-
- Modernizr = {},
-
- /*>>cssclasses*/
- // option for enabling the HTML classes to be added
- enableClasses = true,
- /*>>cssclasses*/
-
- docElement = document.documentElement,
-
- /**
- * Create our "modernizr" element that we do most feature tests on.
- */
- mod = 'modernizr',
- modElem = document.createElement(mod),
- mStyle = modElem.style,
-
- /**
- * Create the input element for various Web Forms feature tests.
- */
- inputElem /*>>inputelem*/ = document.createElement('input') /*>>inputelem*/ ,
-
- /*>>smile*/
- smile = ':)',
- /*>>smile*/
-
- toString = {}.toString,
-
- // TODO :: make the prefixes more granular
- /*>>prefixes*/
- // List of property values to set for css tests. See ticket #21
- prefixes = ' -webkit- -moz- -o- -ms- '.split(' '),
- /*>>prefixes*/
-
- /*>>domprefixes*/
- // Following spec is to expose vendor-specific style properties as:
- // elem.style.WebkitBorderRadius
- // and the following would be incorrect:
- // elem.style.webkitBorderRadius
-
- // Webkit ghosts their properties in lowercase but Opera & Moz do not.
- // Microsoft uses a lowercase `ms` instead of the correct `Ms` in IE8+
- // erik.eae.net/archives/2008/03/10/21.48.10/
-
- // More here: github.com/Modernizr/Modernizr/issues/issue/21
- omPrefixes = 'Webkit Moz O ms',
-
- cssomPrefixes = omPrefixes.split(' '),
-
- domPrefixes = omPrefixes.toLowerCase().split(' '),
- /*>>domprefixes*/
-
- /*>>ns*/
- ns = {'svg': 'http://www.w3.org/2000/svg'},
- /*>>ns*/
-
- tests = {},
- inputs = {},
- attrs = {},
-
- classes = [],
-
- slice = classes.slice,
-
- featureName, // used in testing loop
-
-
- /*>>teststyles*/
- // Inject element with style element and some CSS rules
- injectElementWithStyles = function( rule, callback, nodes, testnames ) {
-
- var style, ret, node, docOverflow,
- div = document.createElement('div'),
- // After page load injecting a fake body doesn't work so check if body exists
- body = document.body,
- // IE6 and 7 won't return offsetWidth or offsetHeight unless it's in the body element, so we fake it.
- fakeBody = body || document.createElement('body');
-
- if ( parseInt(nodes, 10) ) {
- // In order not to give false positives we create a node for each test
- // This also allows the method to scale for unspecified uses
- while ( nodes-- ) {
- node = document.createElement('div');
- node.id = testnames ? testnames[nodes] : mod + (nodes + 1);
- div.appendChild(node);
- }
- }
-
- // '].join('');
- div.id = mod;
- // IE6 will false positive on some tests due to the style element inside the test div somehow interfering offsetHeight, so insert it into body or fakebody.
- // Opera will act all quirky when injecting elements in documentElement when page is served as xml, needs fakebody too. #270
- (body ? div : fakeBody).innerHTML += style;
- fakeBody.appendChild(div);
- if ( !body ) {
- //avoid crashing IE8, if background image is used
- fakeBody.style.background = '';
- //Safari 5.13/5.1.4 OSX stops loading if ::-webkit-scrollbar is used and scrollbars are visible
- fakeBody.style.overflow = 'hidden';
- docOverflow = docElement.style.overflow;
- docElement.style.overflow = 'hidden';
- docElement.appendChild(fakeBody);
- }
-
- ret = callback(div, rule);
- // If this is done after page load we don't want to remove the body so check if body exists
- if ( !body ) {
- fakeBody.parentNode.removeChild(fakeBody);
- docElement.style.overflow = docOverflow;
- } else {
- div.parentNode.removeChild(div);
- }
-
- return !!ret;
-
- },
- /*>>teststyles*/
-
- /*>>mq*/
- // adapted from matchMedia polyfill
- // by Scott Jehl and Paul Irish
- // gist.github.com/786768
- testMediaQuery = function( mq ) {
-
- var matchMedia = window.matchMedia || window.msMatchMedia;
- if ( matchMedia ) {
- return matchMedia(mq).matches;
- }
-
- var bool;
-
- injectElementWithStyles('@media ' + mq + ' { #' + mod + ' { position: absolute; } }', function( node ) {
- bool = (window.getComputedStyle ?
- getComputedStyle(node, null) :
- node.currentStyle)['position'] == 'absolute';
- });
-
- return bool;
-
- },
- /*>>mq*/
-
-
- /*>>hasevent*/
- //
- // isEventSupported determines if a given element supports the given event
- // kangax.github.com/iseventsupported/
- //
- // The following results are known incorrects:
- // Modernizr.hasEvent("webkitTransitionEnd", elem) // false negative
- // Modernizr.hasEvent("textInput") // in Webkit. github.com/Modernizr/Modernizr/issues/333
- // ...
- isEventSupported = (function() {
-
- var TAGNAMES = {
- 'select': 'input', 'change': 'input',
- 'submit': 'form', 'reset': 'form',
- 'error': 'img', 'load': 'img', 'abort': 'img'
- };
-
- function isEventSupported( eventName, element ) {
-
- element = element || document.createElement(TAGNAMES[eventName] || 'div');
- eventName = 'on' + eventName;
-
- // When using `setAttribute`, IE skips "unload", WebKit skips "unload" and "resize", whereas `in` "catches" those
- var isSupported = eventName in element;
-
- if ( !isSupported ) {
- // If it has no `setAttribute` (i.e. doesn't implement Node interface), try generic element
- if ( !element.setAttribute ) {
- element = document.createElement('div');
- }
- if ( element.setAttribute && element.removeAttribute ) {
- element.setAttribute(eventName, '');
- isSupported = is(element[eventName], 'function');
-
- // If property was created, "remove it" (by setting value to `undefined`)
- if ( !is(element[eventName], 'undefined') ) {
- element[eventName] = undefined;
- }
- element.removeAttribute(eventName);
- }
- }
-
- element = null;
- return isSupported;
- }
- return isEventSupported;
- })(),
- /*>>hasevent*/
-
- // TODO :: Add flag for hasownprop ? didn't last time
-
- // hasOwnProperty shim by kangax needed for Safari 2.0 support
- _hasOwnProperty = ({}).hasOwnProperty, hasOwnProp;
-
- if ( !is(_hasOwnProperty, 'undefined') && !is(_hasOwnProperty.call, 'undefined') ) {
- hasOwnProp = function (object, property) {
- return _hasOwnProperty.call(object, property);
- };
- }
- else {
- hasOwnProp = function (object, property) { /* yes, this can give false positives/negatives, but most of the time we don't care about those */
- return ((property in object) && is(object.constructor.prototype[property], 'undefined'));
- };
- }
-
- // Adapted from ES5-shim https://github.com/kriskowal/es5-shim/blob/master/es5-shim.js
- // es5.github.com/#x15.3.4.5
-
- if (!Function.prototype.bind) {
- Function.prototype.bind = function bind(that) {
-
- var target = this;
-
- if (typeof target != "function") {
- throw new TypeError();
- }
-
- var args = slice.call(arguments, 1),
- bound = function () {
-
- if (this instanceof bound) {
-
- var F = function(){};
- F.prototype = target.prototype;
- var self = new F();
-
- var result = target.apply(
- self,
- args.concat(slice.call(arguments))
- );
- if (Object(result) === result) {
- return result;
- }
- return self;
-
- } else {
-
- return target.apply(
- that,
- args.concat(slice.call(arguments))
- );
-
- }
-
- };
-
- return bound;
- };
- }
-
- /**
- * setCss applies given styles to the Modernizr DOM node.
- */
- function setCss( str ) {
- mStyle.cssText = str;
- }
-
- /**
- * setCssAll extrapolates all vendor-specific css strings.
- */
- function setCssAll( str1, str2 ) {
- return setCss(prefixes.join(str1 + ';') + ( str2 || '' ));
- }
-
- /**
- * is returns a boolean for if typeof obj is exactly type.
- */
- function is( obj, type ) {
- return typeof obj === type;
- }
-
- /**
- * contains returns a boolean for if substr is found within str.
- */
- function contains( str, substr ) {
- return !!~('' + str).indexOf(substr);
- }
-
- /*>>testprop*/
-
- // testProps is a generic CSS / DOM property test.
-
- // In testing support for a given CSS property, it's legit to test:
- // `elem.style[styleName] !== undefined`
- // If the property is supported it will return an empty string,
- // if unsupported it will return undefined.
-
- // We'll take advantage of this quick test and skip setting a style
- // on our modernizr element, but instead just testing undefined vs
- // empty string.
-
- // Because the testing of the CSS property names (with "-", as
- // opposed to the camelCase DOM properties) is non-portable and
- // non-standard but works in WebKit and IE (but not Gecko or Opera),
- // we explicitly reject properties with dashes so that authors
- // developing in WebKit or IE first don't end up with
- // browser-specific content by accident.
-
- function testProps( props, prefixed ) {
- for ( var i in props ) {
- var prop = props[i];
- if ( !contains(prop, "-") && mStyle[prop] !== undefined ) {
- return prefixed == 'pfx' ? prop : true;
- }
- }
- return false;
- }
- /*>>testprop*/
-
- // TODO :: add testDOMProps
- /**
- * testDOMProps is a generic DOM property test; if a browser supports
- * a certain property, it won't return undefined for it.
- */
- function testDOMProps( props, obj, elem ) {
- for ( var i in props ) {
- var item = obj[props[i]];
- if ( item !== undefined) {
-
- // return the property name as a string
- if (elem === false) return props[i];
-
- // let's bind a function
- if (is(item, 'function')){
- // default to autobind unless override
- return item.bind(elem || obj);
- }
-
- // return the unbound function or obj or value
- return item;
- }
- }
- return false;
- }
-
- /*>>testallprops*/
- /**
- * testPropsAll tests a list of DOM properties we want to check against.
- * We specify literally ALL possible (known and/or likely) properties on
- * the element including the non-vendor prefixed one, for forward-
- * compatibility.
- */
- function testPropsAll( prop, prefixed, elem ) {
-
- var ucProp = prop.charAt(0).toUpperCase() + prop.slice(1),
- props = (prop + ' ' + cssomPrefixes.join(ucProp + ' ') + ucProp).split(' ');
-
- // did they call .prefixed('boxSizing') or are we just testing a prop?
- if(is(prefixed, "string") || is(prefixed, "undefined")) {
- return testProps(props, prefixed);
-
- // otherwise, they called .prefixed('requestAnimationFrame', window[, elem])
- } else {
- props = (prop + ' ' + (domPrefixes).join(ucProp + ' ') + ucProp).split(' ');
- return testDOMProps(props, prefixed, elem);
- }
- }
- /*>>testallprops*/
-
-
- /**
- * Tests
- * -----
- */
-
- // The *new* flexbox
- // dev.w3.org/csswg/css3-flexbox
-
- tests['flexbox'] = function() {
- return testPropsAll('flexWrap');
- };
-
- // The *old* flexbox
- // www.w3.org/TR/2009/WD-css3-flexbox-20090723/
-
- tests['flexboxlegacy'] = function() {
- return testPropsAll('boxDirection');
- };
-
- // On the S60 and BB Storm, getContext exists, but always returns undefined
- // so we actually have to call getContext() to verify
- // github.com/Modernizr/Modernizr/issues/issue/97/
-
- tests['canvas'] = function() {
- var elem = document.createElement('canvas');
- return !!(elem.getContext && elem.getContext('2d'));
- };
-
- tests['canvastext'] = function() {
- return !!(Modernizr['canvas'] && is(document.createElement('canvas').getContext('2d').fillText, 'function'));
- };
-
- // webk.it/70117 is tracking a legit WebGL feature detect proposal
-
- // We do a soft detect which may false positive in order to avoid
- // an expensive context creation: bugzil.la/732441
-
- tests['webgl'] = function() {
- return !!window.WebGLRenderingContext;
- };
-
- /*
- * The Modernizr.touch test only indicates if the browser supports
- * touch events, which does not necessarily reflect a touchscreen
- * device, as evidenced by tablets running Windows 7 or, alas,
- * the Palm Pre / WebOS (touch) phones.
- *
- * Additionally, Chrome (desktop) used to lie about its support on this,
- * but that has since been rectified: crbug.com/36415
- *
- * We also test for Firefox 4 Multitouch Support.
- *
- * For more info, see: modernizr.github.com/Modernizr/touch.html
- */
-
- tests['touch'] = function() {
- var bool;
-
- if(('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch) {
- bool = true;
- } else {
- injectElementWithStyles(['@media (',prefixes.join('touch-enabled),('),mod,')','{#modernizr{top:9px;position:absolute}}'].join(''), function( node ) {
- bool = node.offsetTop === 9;
- });
- }
-
- return bool;
- };
-
-
- // geolocation is often considered a trivial feature detect...
- // Turns out, it's quite tricky to get right:
- //
- // Using !!navigator.geolocation does two things we don't want. It:
- // 1. Leaks memory in IE9: github.com/Modernizr/Modernizr/issues/513
- // 2. Disables page caching in WebKit: webk.it/43956
- //
- // Meanwhile, in Firefox < 8, an about:config setting could expose
- // a false positive that would throw an exception: bugzil.la/688158
-
- tests['geolocation'] = function() {
- return 'geolocation' in navigator;
- };
-
-
- tests['postmessage'] = function() {
- return !!window.postMessage;
- };
-
-
- // Chrome incognito mode used to throw an exception when using openDatabase
- // It doesn't anymore.
- tests['websqldatabase'] = function() {
- return !!window.openDatabase;
- };
-
- // Vendors had inconsistent prefixing with the experimental Indexed DB:
- // - Webkit's implementation is accessible through webkitIndexedDB
- // - Firefox shipped moz_indexedDB before FF4b9, but since then has been mozIndexedDB
- // For speed, we don't test the legacy (and beta-only) indexedDB
- tests['indexedDB'] = function() {
- return !!testPropsAll("indexedDB", window);
- };
-
- // documentMode logic from YUI to filter out IE8 Compat Mode
- // which false positives.
- tests['hashchange'] = function() {
- return isEventSupported('hashchange', window) && (document.documentMode === undefined || document.documentMode > 7);
- };
-
- // Per 1.6:
- // This used to be Modernizr.historymanagement but the longer
- // name has been deprecated in favor of a shorter and property-matching one.
- // The old API is still available in 1.6, but as of 2.0 will throw a warning,
- // and in the first release thereafter disappear entirely.
- tests['history'] = function() {
- return !!(window.history && history.pushState);
- };
-
- tests['draganddrop'] = function() {
- var div = document.createElement('div');
- return ('draggable' in div) || ('ondragstart' in div && 'ondrop' in div);
- };
-
- // FF3.6 was EOL'ed on 4/24/12, but the ESR version of FF10
- // will be supported until FF19 (2/12/13), at which time, ESR becomes FF17.
- // FF10 still uses prefixes, so check for it until then.
- // for more ESR info, see: mozilla.org/en-US/firefox/organizations/faq/
- tests['websockets'] = function() {
- return 'WebSocket' in window || 'MozWebSocket' in window;
- };
-
-
- // css-tricks.com/rgba-browser-support/
- tests['rgba'] = function() {
- // Set an rgba() color and check the returned value
-
- setCss('background-color:rgba(150,255,150,.5)');
-
- return contains(mStyle.backgroundColor, 'rgba');
- };
-
- tests['hsla'] = function() {
- // Same as rgba(), in fact, browsers re-map hsla() to rgba() internally,
- // except IE9 who retains it as hsla
-
- setCss('background-color:hsla(120,40%,100%,.5)');
-
- return contains(mStyle.backgroundColor, 'rgba') || contains(mStyle.backgroundColor, 'hsla');
- };
-
- tests['multiplebgs'] = function() {
- // Setting multiple images AND a color on the background shorthand property
- // and then querying the style.background property value for the number of
- // occurrences of "url(" is a reliable method for detecting ACTUAL support for this!
-
- setCss('background:url(https://),url(https://),red url(https://)');
-
- // If the UA supports multiple backgrounds, there should be three occurrences
- // of the string "url(" in the return value for elemStyle.background
-
- return (/(url\s*\(.*?){3}/).test(mStyle.background);
- };
-
-
-
- // this will false positive in Opera Mini
- // github.com/Modernizr/Modernizr/issues/396
-
- tests['backgroundsize'] = function() {
- return testPropsAll('backgroundSize');
- };
-
- tests['borderimage'] = function() {
- return testPropsAll('borderImage');
- };
-
-
- // Super comprehensive table about all the unique implementations of
- // border-radius: muddledramblings.com/table-of-css3-border-radius-compliance
-
- tests['borderradius'] = function() {
- return testPropsAll('borderRadius');
- };
-
- // WebOS unfortunately false positives on this test.
- tests['boxshadow'] = function() {
- return testPropsAll('boxShadow');
- };
-
- // FF3.0 will false positive on this test
- tests['textshadow'] = function() {
- return document.createElement('div').style.textShadow === '';
- };
-
-
- tests['opacity'] = function() {
- // Browsers that actually have CSS Opacity implemented have done so
- // according to spec, which means their return values are within the
- // range of [0.0,1.0] - including the leading zero.
-
- setCssAll('opacity:.55');
-
- // The non-literal . in this regex is intentional:
- // German Chrome returns this value as 0,55
- // github.com/Modernizr/Modernizr/issues/#issue/59/comment/516632
- return (/^0.55$/).test(mStyle.opacity);
- };
-
-
- // Note, Android < 4 will pass this test, but can only animate
- // a single property at a time
- // daneden.me/2011/12/putting-up-with-androids-bullshit/
- tests['cssanimations'] = function() {
- return testPropsAll('animationName');
- };
-
-
- tests['csscolumns'] = function() {
- return testPropsAll('columnCount');
- };
-
-
- tests['cssgradients'] = function() {
- /**
- * For CSS Gradients syntax, please see:
- * webkit.org/blog/175/introducing-css-gradients/
- * developer.mozilla.org/en/CSS/-moz-linear-gradient
- * developer.mozilla.org/en/CSS/-moz-radial-gradient
- * dev.w3.org/csswg/css3-images/#gradients-
- */
-
- var str1 = 'background-image:',
- str2 = 'gradient(linear,left top,right bottom,from(#9f9),to(white));',
- str3 = 'linear-gradient(left top,#9f9, white);';
-
- setCss(
- // legacy webkit syntax (FIXME: remove when syntax not in use anymore)
- (str1 + '-webkit- '.split(' ').join(str2 + str1) +
- // standard syntax // trailing 'background-image:'
- prefixes.join(str3 + str1)).slice(0, -str1.length)
- );
-
- return contains(mStyle.backgroundImage, 'gradient');
- };
-
-
- tests['cssreflections'] = function() {
- return testPropsAll('boxReflect');
- };
-
-
- tests['csstransforms'] = function() {
- return !!testPropsAll('transform');
- };
-
-
- tests['csstransforms3d'] = function() {
-
- var ret = !!testPropsAll('perspective');
-
- // Webkit's 3D transforms are passed off to the browser's own graphics renderer.
- // It works fine in Safari on Leopard and Snow Leopard, but not in Chrome in
- // some conditions. As a result, Webkit typically recognizes the syntax but
- // will sometimes throw a false positive, thus we must do a more thorough check:
- if ( ret && 'webkitPerspective' in docElement.style ) {
-
- // Webkit allows this media query to succeed only if the feature is enabled.
- // `@media (transform-3d),(-webkit-transform-3d){ ... }`
- injectElementWithStyles('@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}', function( node, rule ) {
- ret = node.offsetLeft === 9 && node.offsetHeight === 3;
- });
- }
- return ret;
- };
-
-
- tests['csstransitions'] = function() {
- return testPropsAll('transition');
- };
-
-
- /*>>fontface*/
- // @font-face detection routine by Diego Perini
- // javascript.nwbox.com/CSSSupport/
-
- // false positives:
- // WebOS github.com/Modernizr/Modernizr/issues/342
- // WP7 github.com/Modernizr/Modernizr/issues/538
- tests['fontface'] = function() {
- var bool;
-
- injectElementWithStyles('@font-face {font-family:"font";src:url("https://")}', function( node, rule ) {
- var style = document.getElementById('smodernizr'),
- sheet = style.sheet || style.styleSheet,
- cssText = sheet ? (sheet.cssRules && sheet.cssRules[0] ? sheet.cssRules[0].cssText : sheet.cssText || '') : '';
-
- bool = /src/i.test(cssText) && cssText.indexOf(rule.split(' ')[0]) === 0;
- });
-
- return bool;
- };
- /*>>fontface*/
-
- // CSS generated content detection
- tests['generatedcontent'] = function() {
- var bool;
-
- injectElementWithStyles(['#',mod,'{font:0/0 a}#',mod,':after{content:"',smile,'";visibility:hidden;font:3px/1 a}'].join(''), function( node ) {
- bool = node.offsetHeight >= 3;
- });
-
- return bool;
- };
-
-
-
- // These tests evaluate support of the video/audio elements, as well as
- // testing what types of content they support.
- //
- // We're using the Boolean constructor here, so that we can extend the value
- // e.g. Modernizr.video // true
- // Modernizr.video.ogg // 'probably'
- //
- // Codec values from : github.com/NielsLeenheer/html5test/blob/9106a8/index.html#L845
- // thx to NielsLeenheer and zcorpan
-
- // Note: in some older browsers, "no" was a return value instead of empty string.
- // It was live in FF3.5.0 and 3.5.1, but fixed in 3.5.2
- // It was also live in Safari 4.0.0 - 4.0.4, but fixed in 4.0.5
-
- tests['video'] = function() {
- var elem = document.createElement('video'),
- bool = false;
-
- // IE9 Running on Windows Server SKU can cause an exception to be thrown, bug #224
- try {
- if ( bool = !!elem.canPlayType ) {
- bool = new Boolean(bool);
- bool.ogg = elem.canPlayType('video/ogg; codecs="theora"') .replace(/^no$/,'');
-
- // Without QuickTime, this value will be `undefined`. github.com/Modernizr/Modernizr/issues/546
- bool.h264 = elem.canPlayType('video/mp4; codecs="avc1.42E01E"') .replace(/^no$/,'');
-
- bool.webm = elem.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/^no$/,'');
- }
-
- } catch(e) { }
-
- return bool;
- };
-
- tests['audio'] = function() {
- var elem = document.createElement('audio'),
- bool = false;
-
- try {
- if ( bool = !!elem.canPlayType ) {
- bool = new Boolean(bool);
- bool.ogg = elem.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,'');
- bool.mp3 = elem.canPlayType('audio/mpeg;') .replace(/^no$/,'');
-
- // Mimetypes accepted:
- // developer.mozilla.org/En/Media_formats_supported_by_the_audio_and_video_elements
- // bit.ly/iphoneoscodecs
- bool.wav = elem.canPlayType('audio/wav; codecs="1"') .replace(/^no$/,'');
- bool.m4a = ( elem.canPlayType('audio/x-m4a;') ||
- elem.canPlayType('audio/aac;')) .replace(/^no$/,'');
- }
- } catch(e) { }
-
- return bool;
- };
-
-
- // In FF4, if disabled, window.localStorage should === null.
-
- // Normally, we could not test that directly and need to do a
- // `('localStorage' in window) && ` test first because otherwise Firefox will
- // throw bugzil.la/365772 if cookies are disabled
-
- // Also in iOS5 Private Browsing mode, attempting to use localStorage.setItem
- // will throw the exception:
- // QUOTA_EXCEEDED_ERRROR DOM Exception 22.
- // Peculiarly, getItem and removeItem calls do not throw.
-
- // Because we are forced to try/catch this, we'll go aggressive.
-
- // Just FWIW: IE8 Compat mode supports these features completely:
- // www.quirksmode.org/dom/html5.html
- // But IE8 doesn't support either with local files
-
- tests['localstorage'] = function() {
- try {
- localStorage.setItem(mod, mod);
- localStorage.removeItem(mod);
- return true;
- } catch(e) {
- return false;
- }
- };
-
- tests['sessionstorage'] = function() {
- try {
- sessionStorage.setItem(mod, mod);
- sessionStorage.removeItem(mod);
- return true;
- } catch(e) {
- return false;
- }
- };
-
-
- tests['webworkers'] = function() {
- return !!window.Worker;
- };
-
-
- tests['applicationcache'] = function() {
- return !!window.applicationCache;
- };
-
-
- // Thanks to Erik Dahlstrom
- tests['svg'] = function() {
- return !!document.createElementNS && !!document.createElementNS(ns.svg, 'svg').createSVGRect;
- };
-
- // specifically for SVG inline in HTML, not within XHTML
- // test page: paulirish.com/demo/inline-svg
- tests['inlinesvg'] = function() {
- var div = document.createElement('div');
- div.innerHTML = '
';
- return (div.firstChild && div.firstChild.namespaceURI) == ns.svg;
- };
-
- // SVG SMIL animation
- tests['smil'] = function() {
- return !!document.createElementNS && /SVGAnimate/.test(toString.call(document.createElementNS(ns.svg, 'animate')));
- };
-
- // This test is only for clip paths in SVG proper, not clip paths on HTML content
- // demo: srufaculty.sru.edu/david.dailey/svg/newstuff/clipPath4.svg
-
- // However read the comments to dig into applying SVG clippaths to HTML content here:
- // github.com/Modernizr/Modernizr/issues/213#issuecomment-1149491
- tests['svgclippaths'] = function() {
- return !!document.createElementNS && /SVGClipPath/.test(toString.call(document.createElementNS(ns.svg, 'clipPath')));
- };
-
- /*>>webforms*/
- // input features and input types go directly onto the ret object, bypassing the tests loop.
- // Hold this guy to execute in a moment.
- function webforms() {
- /*>>input*/
- // Run through HTML5's new input attributes to see if the UA understands any.
- // We're using f which is the
element created early on
- // Mike Taylr has created a comprehensive resource for testing these attributes
- // when applied to all input types:
- // miketaylr.com/code/input-type-attr.html
- // spec: www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary
-
- // Only input placeholder is tested while textarea's placeholder is not.
- // Currently Safari 4 and Opera 11 have support only for the input placeholder
- // Both tests are available in feature-detects/forms-placeholder.js
- Modernizr['input'] = (function( props ) {
- for ( var i = 0, len = props.length; i < len; i++ ) {
- attrs[ props[i] ] = !!(props[i] in inputElem);
- }
- if (attrs.list){
- // safari false positive's on datalist: webk.it/74252
- // see also github.com/Modernizr/Modernizr/issues/146
- attrs.list = !!(document.createElement('datalist') && window.HTMLDataListElement);
- }
- return attrs;
- })('autocomplete autofocus list placeholder max min multiple pattern required step'.split(' '));
- /*>>input*/
-
- /*>>inputtypes*/
- // Run through HTML5's new input types to see if the UA understands any.
- // This is put behind the tests runloop because it doesn't return a
- // true/false like all the other tests; instead, it returns an object
- // containing each input type with its corresponding true/false value
-
- // Big thanks to @miketaylr for the html5 forms expertise. miketaylr.com/
- Modernizr['inputtypes'] = (function(props) {
-
- for ( var i = 0, bool, inputElemType, defaultView, len = props.length; i < len; i++ ) {
-
- inputElem.setAttribute('type', inputElemType = props[i]);
- bool = inputElem.type !== 'text';
-
- // We first check to see if the type we give it sticks..
- // If the type does, we feed it a textual value, which shouldn't be valid.
- // If the value doesn't stick, we know there's input sanitization which infers a custom UI
- if ( bool ) {
-
- inputElem.value = smile;
- inputElem.style.cssText = 'position:absolute;visibility:hidden;';
-
- if ( /^range$/.test(inputElemType) && inputElem.style.WebkitAppearance !== undefined ) {
-
- docElement.appendChild(inputElem);
- defaultView = document.defaultView;
-
- // Safari 2-4 allows the smiley as a value, despite making a slider
- bool = defaultView.getComputedStyle &&
- defaultView.getComputedStyle(inputElem, null).WebkitAppearance !== 'textfield' &&
- // Mobile android web browser has false positive, so must
- // check the height to see if the widget is actually there.
- (inputElem.offsetHeight !== 0);
-
- docElement.removeChild(inputElem);
-
- } else if ( /^(search|tel)$/.test(inputElemType) ){
- // Spec doesn't define any special parsing or detectable UI
- // behaviors so we pass these through as true
-
- // Interestingly, opera fails the earlier test, so it doesn't
- // even make it here.
-
- } else if ( /^(url|email)$/.test(inputElemType) ) {
- // Real url and email support comes with prebaked validation.
- bool = inputElem.checkValidity && inputElem.checkValidity() === false;
-
- } else {
- // If the upgraded input compontent rejects the :) text, we got a winner
- bool = inputElem.value != smile;
- }
- }
-
- inputs[ props[i] ] = !!bool;
- }
- return inputs;
- })('search tel url email datetime date month week time datetime-local number range color'.split(' '));
- /*>>inputtypes*/
- }
- /*>>webforms*/
-
-
- // End of test definitions
- // -----------------------
-
-
-
- // Run through all tests and detect their support in the current UA.
- // todo: hypothetically we could be doing an array of tests and use a basic loop here.
- for ( var feature in tests ) {
- if ( hasOwnProp(tests, feature) ) {
- // run the test, throw the return value into the Modernizr,
- // then based on that boolean, define an appropriate className
- // and push it into an array of classes we'll join later.
- featureName = feature.toLowerCase();
- Modernizr[featureName] = tests[feature]();
-
- classes.push((Modernizr[featureName] ? '' : 'no-') + featureName);
- }
- }
-
- /*>>webforms*/
- // input tests need to run.
- Modernizr.input || webforms();
- /*>>webforms*/
-
-
- /**
- * addTest allows the user to define their own feature tests
- * the result will be added onto the Modernizr object,
- * as well as an appropriate className set on the html element
- *
- * @param feature - String naming the feature
- * @param test - Function returning true if feature is supported, false if not
- */
- Modernizr.addTest = function ( feature, test ) {
- if ( typeof feature == 'object' ) {
- for ( var key in feature ) {
- if ( hasOwnProp( feature, key ) ) {
- Modernizr.addTest( key, feature[ key ] );
- }
- }
- } else {
-
- feature = feature.toLowerCase();
-
- if ( Modernizr[feature] !== undefined ) {
- // we're going to quit if you're trying to overwrite an existing test
- // if we were to allow it, we'd do this:
- // var re = new RegExp("\\b(no-)?" + feature + "\\b");
- // docElement.className = docElement.className.replace( re, '' );
- // but, no rly, stuff 'em.
- return Modernizr;
- }
-
- test = typeof test == 'function' ? test() : test;
-
- if (typeof enableClasses !== "undefined" && enableClasses) {
- docElement.className += ' ' + (test ? '' : 'no-') + feature;
- }
- Modernizr[feature] = test;
-
- }
-
- return Modernizr; // allow chaining.
- };
-
-
- // Reset modElem.cssText to nothing to reduce memory footprint.
- setCss('');
- modElem = inputElem = null;
-
- /*>>shiv*/
- /*! HTML5 Shiv v3.6.1 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed */
- ;(function(window, document) {
- /*jshint evil:true */
- /** Preset options */
- var options = window.html5 || {};
-
- /** Used to skip problem elements */
- var reSkip = /^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i;
-
- /** Not all elements can be cloned in IE **/
- var saveClones = /^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i;
-
- /** Detect whether the browser supports default html5 styles */
- var supportsHtml5Styles;
-
- /** Name of the expando, to work with multiple documents or to re-shiv one document */
- var expando = '_html5shiv';
-
- /** The id for the the documents expando */
- var expanID = 0;
-
- /** Cached data for each document */
- var expandoData = {};
-
- /** Detect whether the browser supports unknown elements */
- var supportsUnknownElements;
-
- (function() {
- try {
- var a = document.createElement('a');
- a.innerHTML = '
';
- //if the hidden property is implemented we can assume, that the browser supports basic HTML5 Styles
- supportsHtml5Styles = ('hidden' in a);
-
- supportsUnknownElements = a.childNodes.length == 1 || (function() {
- // assign a false positive if unable to shiv
- (document.createElement)('a');
- var frag = document.createDocumentFragment();
- return (
- typeof frag.cloneNode == 'undefined' ||
- typeof frag.createDocumentFragment == 'undefined' ||
- typeof frag.createElement == 'undefined'
- );
- }());
- } catch(e) {
- supportsHtml5Styles = true;
- supportsUnknownElements = true;
- }
-
- }());
-
- /*--------------------------------------------------------------------------*/
-
- /**
- * Creates a style sheet with the given CSS text and adds it to the document.
- * @private
- * @param {Document} ownerDocument The document.
- * @param {String} cssText The CSS text.
- * @returns {StyleSheet} The style element.
- */
- function addStyleSheet(ownerDocument, cssText) {
- var p = ownerDocument.createElement('p'),
- parent = ownerDocument.getElementsByTagName('head')[0] || ownerDocument.documentElement;
-
- p.innerHTML = 'x';
- return parent.insertBefore(p.lastChild, parent.firstChild);
- }
-
- /**
- * Returns the value of `html5.elements` as an array.
- * @private
- * @returns {Array} An array of shived element node names.
- */
- function getElements() {
- var elements = html5.elements;
- return typeof elements == 'string' ? elements.split(' ') : elements;
- }
-
- /**
- * Returns the data associated to the given document
- * @private
- * @param {Document} ownerDocument The document.
- * @returns {Object} An object of data.
- */
- function getExpandoData(ownerDocument) {
- var data = expandoData[ownerDocument[expando]];
- if (!data) {
- data = {};
- expanID++;
- ownerDocument[expando] = expanID;
- expandoData[expanID] = data;
- }
- return data;
- }
-
- /**
- * returns a shived element for the given nodeName and document
- * @memberOf html5
- * @param {String} nodeName name of the element
- * @param {Document} ownerDocument The context document.
- * @returns {Object} The shived element.
- */
- function createElement(nodeName, ownerDocument, data){
- if (!ownerDocument) {
- ownerDocument = document;
- }
- if(supportsUnknownElements){
- return ownerDocument.createElement(nodeName);
- }
- if (!data) {
- data = getExpandoData(ownerDocument);
- }
- var node;
-
- if (data.cache[nodeName]) {
- node = data.cache[nodeName].cloneNode();
- } else if (saveClones.test(nodeName)) {
- node = (data.cache[nodeName] = data.createElem(nodeName)).cloneNode();
- } else {
- node = data.createElem(nodeName);
- }
-
- // Avoid adding some elements to fragments in IE < 9 because
- // * Attributes like `name` or `type` cannot be set/changed once an element
- // is inserted into a document/fragment
- // * Link elements with `src` attributes that are inaccessible, as with
- // a 403 response, will cause the tab/window to crash
- // * Script elements appended to fragments will execute when their `src`
- // or `text` property is set
- return node.canHaveChildren && !reSkip.test(nodeName) ? data.frag.appendChild(node) : node;
- }
-
- /**
- * returns a shived DocumentFragment for the given document
- * @memberOf html5
- * @param {Document} ownerDocument The context document.
- * @returns {Object} The shived DocumentFragment.
- */
- function createDocumentFragment(ownerDocument, data){
- if (!ownerDocument) {
- ownerDocument = document;
- }
- if(supportsUnknownElements){
- return ownerDocument.createDocumentFragment();
- }
- data = data || getExpandoData(ownerDocument);
- var clone = data.frag.cloneNode(),
- i = 0,
- elems = getElements(),
- l = elems.length;
- for(;i
>shiv*/
-
- // Assign private properties to the return object with prefix
- Modernizr._version = version;
-
- // expose these for the plugin API. Look in the source for how to join() them against your input
- /*>>prefixes*/
- Modernizr._prefixes = prefixes;
- /*>>prefixes*/
- /*>>domprefixes*/
- Modernizr._domPrefixes = domPrefixes;
- Modernizr._cssomPrefixes = cssomPrefixes;
- /*>>domprefixes*/
-
- /*>>mq*/
- // Modernizr.mq tests a given media query, live against the current state of the window
- // A few important notes:
- // * If a browser does not support media queries at all (eg. oldIE) the mq() will always return false
- // * A max-width or orientation query will be evaluated against the current state, which may change later.
- // * You must specify values. Eg. If you are testing support for the min-width media query use:
- // Modernizr.mq('(min-width:0)')
- // usage:
- // Modernizr.mq('only screen and (max-width:768)')
- Modernizr.mq = testMediaQuery;
- /*>>mq*/
-
- /*>>hasevent*/
- // Modernizr.hasEvent() detects support for a given event, with an optional element to test on
- // Modernizr.hasEvent('gesturestart', elem)
- Modernizr.hasEvent = isEventSupported;
- /*>>hasevent*/
-
- /*>>testprop*/
- // Modernizr.testProp() investigates whether a given style property is recognized
- // Note that the property names must be provided in the camelCase variant.
- // Modernizr.testProp('pointerEvents')
- Modernizr.testProp = function(prop){
- return testProps([prop]);
- };
- /*>>testprop*/
-
- /*>>testallprops*/
- // Modernizr.testAllProps() investigates whether a given style property,
- // or any of its vendor-prefixed variants, is recognized
- // Note that the property names must be provided in the camelCase variant.
- // Modernizr.testAllProps('boxSizing')
- Modernizr.testAllProps = testPropsAll;
- /*>>testallprops*/
-
-
- /*>>teststyles*/
- // Modernizr.testStyles() allows you to add custom styles to the document and test an element afterwards
- // Modernizr.testStyles('#modernizr { position:absolute }', function(elem, rule){ ... })
- Modernizr.testStyles = injectElementWithStyles;
- /*>>teststyles*/
-
-
- /*>>prefixed*/
- // Modernizr.prefixed() returns the prefixed or nonprefixed property name variant of your input
- // Modernizr.prefixed('boxSizing') // 'MozBoxSizing'
-
- // Properties must be passed as dom-style camelcase, rather than `box-sizing` hypentated style.
- // Return values will also be the camelCase variant, if you need to translate that to hypenated style use:
- //
- // str.replace(/([A-Z])/g, function(str,m1){ return '-' + m1.toLowerCase(); }).replace(/^ms-/,'-ms-');
-
- // If you're trying to ascertain which transition end event to bind to, you might do something like...
- //
- // var transEndEventNames = {
- // 'WebkitTransition' : 'webkitTransitionEnd',
- // 'MozTransition' : 'transitionend',
- // 'OTransition' : 'oTransitionEnd',
- // 'msTransition' : 'MSTransitionEnd',
- // 'transition' : 'transitionend'
- // },
- // transEndEventName = transEndEventNames[ Modernizr.prefixed('transition') ];
-
- Modernizr.prefixed = function(prop, obj, elem){
- if(!obj) {
- return testPropsAll(prop, 'pfx');
- } else {
- // Testing DOM property e.g. Modernizr.prefixed('requestAnimationFrame', window) // 'mozRequestAnimationFrame'
- return testPropsAll(prop, obj, elem);
- }
- };
- /*>>prefixed*/
-
-
- /*>>cssclasses*/
- // Remove "no-js" class from element, if it exists:
- docElement.className = docElement.className.replace(/(^|\s)no-js(\s|$)/, '$1$2') +
-
- // Add the new classes to the element.
- (enableClasses ? ' js ' + classes.join(' ') : '');
- /*>>cssclasses*/
-
- return Modernizr;
-
-})(this, this.document);
diff --git a/Fitbit.Portable.DebugSite/Scripts/respond.js b/Fitbit.Portable.DebugSite/Scripts/respond.js
deleted file mode 100644
index 378d773d..00000000
--- a/Fitbit.Portable.DebugSite/Scripts/respond.js
+++ /dev/null
@@ -1,340 +0,0 @@
-/* NUGET: BEGIN LICENSE TEXT
- *
- * Microsoft grants you the right to use these script files for the sole
- * purpose of either: (i) interacting through your browser with the Microsoft
- * website or online service, subject to the applicable licensing or use
- * terms; or (ii) using the files as included with a Microsoft product subject
- * to that product's license terms. Microsoft reserves all other rights to the
- * files not expressly granted by Microsoft, whether by implication, estoppel
- * or otherwise. Insofar as a script file is dual licensed under GPL,
- * Microsoft neither took the code under GPL nor distributes it thereunder but
- * under the terms set out in this paragraph. All notices and licenses
- * below are for informational purposes only.
- *
- * NUGET: END LICENSE TEXT */
-/*! matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas. Dual MIT/BSD license */
-/*! NOTE: If you're already including a window.matchMedia polyfill via Modernizr or otherwise, you don't need this part */
-window.matchMedia = window.matchMedia || (function(doc, undefined){
-
- var bool,
- docElem = doc.documentElement,
- refNode = docElem.firstElementChild || docElem.firstChild,
- // fakeBody required for
- fakeBody = doc.createElement('body'),
- div = doc.createElement('div');
-
- div.id = 'mq-test-1';
- div.style.cssText = "position:absolute;top:-100em";
- fakeBody.style.background = "none";
- fakeBody.appendChild(div);
-
- return function(q){
-
- div.innerHTML = '';
-
- docElem.insertBefore(fakeBody, refNode);
- bool = div.offsetWidth == 42;
- docElem.removeChild(fakeBody);
-
- return { matches: bool, media: q };
- };
-
-})(document);
-
-
-
-
-/*! Respond.js v1.2.0: min/max-width media query polyfill. (c) Scott Jehl. MIT/GPLv2 Lic. j.mp/respondjs */
-(function( win ){
- //exposed namespace
- win.respond = {};
-
- //define update even in native-mq-supporting browsers, to avoid errors
- respond.update = function(){};
-
- //expose media query support flag for external use
- respond.mediaQueriesSupported = win.matchMedia && win.matchMedia( "only all" ).matches;
-
- //if media queries are supported, exit here
- if( respond.mediaQueriesSupported ){ return; }
-
- //define vars
- var doc = win.document,
- docElem = doc.documentElement,
- mediastyles = [],
- rules = [],
- appendedEls = [],
- parsedSheets = {},
- resizeThrottle = 30,
- head = doc.getElementsByTagName( "head" )[0] || docElem,
- base = doc.getElementsByTagName( "base" )[0],
- links = head.getElementsByTagName( "link" ),
- requestQueue = [],
-
- //loop stylesheets, send text content to translate
- ripCSS = function(){
- var sheets = links,
- sl = sheets.length,
- i = 0,
- //vars for loop:
- sheet, href, media, isCSS;
-
- for( ; i < sl; i++ ){
- sheet = sheets[ i ],
- href = sheet.href,
- media = sheet.media,
- isCSS = sheet.rel && sheet.rel.toLowerCase() === "stylesheet";
-
- //only links plz and prevent re-parsing
- if( !!href && isCSS && !parsedSheets[ href ] ){
- // selectivizr exposes css through the rawCssText expando
- if (sheet.styleSheet && sheet.styleSheet.rawCssText) {
- translate( sheet.styleSheet.rawCssText, href, media );
- parsedSheets[ href ] = true;
- } else {
- if( (!/^([a-zA-Z:]*\/\/)/.test( href ) && !base)
- || href.replace( RegExp.$1, "" ).split( "/" )[0] === win.location.host ){
- requestQueue.push( {
- href: href,
- media: media
- } );
- }
- }
- }
- }
- makeRequests();
- },
-
- //recurse through request queue, get css text
- makeRequests = function(){
- if( requestQueue.length ){
- var thisRequest = requestQueue.shift();
-
- ajax( thisRequest.href, function( styles ){
- translate( styles, thisRequest.href, thisRequest.media );
- parsedSheets[ thisRequest.href ] = true;
- makeRequests();
- } );
- }
- },
-
- //find media blocks in css text, convert to style blocks
- translate = function( styles, href, media ){
- var qs = styles.match( /@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi ),
- ql = qs && qs.length || 0,
- //try to get CSS path
- href = href.substring( 0, href.lastIndexOf( "/" )),
- repUrls = function( css ){
- return css.replace( /(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g, "$1" + href + "$2$3" );
- },
- useMedia = !ql && media,
- //vars used in loop
- i = 0,
- j, fullq, thisq, eachq, eql;
-
- //if path exists, tack on trailing slash
- if( href.length ){ href += "/"; }
-
- //if no internal queries exist, but media attr does, use that
- //note: this currently lacks support for situations where a media attr is specified on a link AND
- //its associated stylesheet has internal CSS media queries.
- //In those cases, the media attribute will currently be ignored.
- if( useMedia ){
- ql = 1;
- }
-
-
- for( ; i < ql; i++ ){
- j = 0;
-
- //media attr
- if( useMedia ){
- fullq = media;
- rules.push( repUrls( styles ) );
- }
- //parse for styles
- else{
- fullq = qs[ i ].match( /@media *([^\{]+)\{([\S\s]+?)$/ ) && RegExp.$1;
- rules.push( RegExp.$2 && repUrls( RegExp.$2 ) );
- }
-
- eachq = fullq.split( "," );
- eql = eachq.length;
-
- for( ; j < eql; j++ ){
- thisq = eachq[ j ];
- mediastyles.push( {
- media : thisq.split( "(" )[ 0 ].match( /(only\s+)?([a-zA-Z]+)\s?/ ) && RegExp.$2 || "all",
- rules : rules.length - 1,
- hasquery: thisq.indexOf("(") > -1,
- minw : thisq.match( /\(min\-width:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/ ) && parseFloat( RegExp.$1 ) + ( RegExp.$2 || "" ),
- maxw : thisq.match( /\(max\-width:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/ ) && parseFloat( RegExp.$1 ) + ( RegExp.$2 || "" )
- } );
- }
- }
-
- applyMedia();
- },
-
- lastCall,
-
- resizeDefer,
-
- // returns the value of 1em in pixels
- getEmValue = function() {
- var ret,
- div = doc.createElement('div'),
- body = doc.body,
- fakeUsed = false;
-
- div.style.cssText = "position:absolute;font-size:1em;width:1em";
-
- if( !body ){
- body = fakeUsed = doc.createElement( "body" );
- body.style.background = "none";
- }
-
- body.appendChild( div );
-
- docElem.insertBefore( body, docElem.firstChild );
-
- ret = div.offsetWidth;
-
- if( fakeUsed ){
- docElem.removeChild( body );
- }
- else {
- body.removeChild( div );
- }
-
- //also update eminpx before returning
- ret = eminpx = parseFloat(ret);
-
- return ret;
- },
-
- //cached container for 1em value, populated the first time it's needed
- eminpx,
-
- //enable/disable styles
- applyMedia = function( fromResize ){
- var name = "clientWidth",
- docElemProp = docElem[ name ],
- currWidth = doc.compatMode === "CSS1Compat" && docElemProp || doc.body[ name ] || docElemProp,
- styleBlocks = {},
- lastLink = links[ links.length-1 ],
- now = (new Date()).getTime();
-
- //throttle resize calls
- if( fromResize && lastCall && now - lastCall < resizeThrottle ){
- clearTimeout( resizeDefer );
- resizeDefer = setTimeout( applyMedia, resizeThrottle );
- return;
- }
- else {
- lastCall = now;
- }
-
- for( var i in mediastyles ){
- var thisstyle = mediastyles[ i ],
- min = thisstyle.minw,
- max = thisstyle.maxw,
- minnull = min === null,
- maxnull = max === null,
- em = "em";
-
- if( !!min ){
- min = parseFloat( min ) * ( min.indexOf( em ) > -1 ? ( eminpx || getEmValue() ) : 1 );
- }
- if( !!max ){
- max = parseFloat( max ) * ( max.indexOf( em ) > -1 ? ( eminpx || getEmValue() ) : 1 );
- }
-
- // if there's no media query at all (the () part), or min or max is not null, and if either is present, they're true
- if( !thisstyle.hasquery || ( !minnull || !maxnull ) && ( minnull || currWidth >= min ) && ( maxnull || currWidth <= max ) ){
- if( !styleBlocks[ thisstyle.media ] ){
- styleBlocks[ thisstyle.media ] = [];
- }
- styleBlocks[ thisstyle.media ].push( rules[ thisstyle.rules ] );
- }
- }
-
- //remove any existing respond style element(s)
- for( var i in appendedEls ){
- if( appendedEls[ i ] && appendedEls[ i ].parentNode === head ){
- head.removeChild( appendedEls[ i ] );
- }
- }
-
- //inject active styles, grouped by media type
- for( var i in styleBlocks ){
- var ss = doc.createElement( "style" ),
- css = styleBlocks[ i ].join( "\n" );
-
- ss.type = "text/css";
- ss.media = i;
-
- //originally, ss was appended to a documentFragment and sheets were appended in bulk.
- //this caused crashes in IE in a number of circumstances, such as when the HTML element had a bg image set, so appending beforehand seems best. Thanks to @dvelyk for the initial research on this one!
- head.insertBefore( ss, lastLink.nextSibling );
-
- if ( ss.styleSheet ){
- ss.styleSheet.cssText = css;
- }
- else {
- ss.appendChild( doc.createTextNode( css ) );
- }
-
- //push to appendedEls to track for later removal
- appendedEls.push( ss );
- }
- },
- //tweaked Ajax functions from Quirksmode
- ajax = function( url, callback ) {
- var req = xmlHttp();
- if (!req){
- return;
- }
- req.open( "GET", url, true );
- req.onreadystatechange = function () {
- if ( req.readyState != 4 || req.status != 200 && req.status != 304 ){
- return;
- }
- callback( req.responseText );
- }
- if ( req.readyState == 4 ){
- return;
- }
- req.send( null );
- },
- //define ajax obj
- xmlHttp = (function() {
- var xmlhttpmethod = false;
- try {
- xmlhttpmethod = new XMLHttpRequest();
- }
- catch( e ){
- xmlhttpmethod = new ActiveXObject( "Microsoft.XMLHTTP" );
- }
- return function(){
- return xmlhttpmethod;
- };
- })();
-
- //translate CSS
- ripCSS();
-
- //expose update for re-running respond later on
- respond.update = ripCSS;
-
- //adjust on resize
- function callMedia(){
- applyMedia( true );
- }
- if( win.addEventListener ){
- win.addEventListener( "resize", callMedia, false );
- }
- else if( win.attachEvent ){
- win.attachEvent( "onresize", callMedia );
- }
-})(this);
diff --git a/Fitbit.Portable.DebugSite/Scripts/respond.min.js b/Fitbit.Portable.DebugSite/Scripts/respond.min.js
deleted file mode 100644
index a8481370..00000000
--- a/Fitbit.Portable.DebugSite/Scripts/respond.min.js
+++ /dev/null
@@ -1,20 +0,0 @@
-/* NUGET: BEGIN LICENSE TEXT
- *
- * Microsoft grants you the right to use these script files for the sole
- * purpose of either: (i) interacting through your browser with the Microsoft
- * website or online service, subject to the applicable licensing or use
- * terms; or (ii) using the files as included with a Microsoft product subject
- * to that product's license terms. Microsoft reserves all other rights to the
- * files not expressly granted by Microsoft, whether by implication, estoppel
- * or otherwise. Insofar as a script file is dual licensed under GPL,
- * Microsoft neither took the code under GPL nor distributes it thereunder but
- * under the terms set out in this paragraph. All notices and licenses
- * below are for informational purposes only.
- *
- * NUGET: END LICENSE TEXT */
-/*! matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas. Dual MIT/BSD license */
-/*! NOTE: If you're already including a window.matchMedia polyfill via Modernizr or otherwise, you don't need this part */
-window.matchMedia=window.matchMedia||(function(e,f){var c,a=e.documentElement,b=a.firstElementChild||a.firstChild,d=e.createElement("body"),g=e.createElement("div");g.id="mq-test-1";g.style.cssText="position:absolute;top:-100em";d.style.background="none";d.appendChild(g);return function(h){g.innerHTML='';a.insertBefore(d,b);c=g.offsetWidth==42;a.removeChild(d);return{matches:c,media:h}}})(document);
-
-/*! Respond.js v1.2.0: min/max-width media query polyfill. (c) Scott Jehl. MIT/GPLv2 Lic. j.mp/respondjs */
-(function(e){e.respond={};respond.update=function(){};respond.mediaQueriesSupported=e.matchMedia&&e.matchMedia("only all").matches;if(respond.mediaQueriesSupported){return}var w=e.document,s=w.documentElement,i=[],k=[],q=[],o={},h=30,f=w.getElementsByTagName("head")[0]||s,g=w.getElementsByTagName("base")[0],b=f.getElementsByTagName("link"),d=[],a=function(){var D=b,y=D.length,B=0,A,z,C,x;for(;B-1,minw:F.match(/\(min\-width:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:F.match(/\(max\-width:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}}j()},l,r,v=function(){var z,A=w.createElement("div"),x=w.body,y=false;A.style.cssText="position:absolute;font-size:1em;width:1em";if(!x){x=y=w.createElement("body");x.style.background="none"}x.appendChild(A);s.insertBefore(x,s.firstChild);z=A.offsetWidth;if(y){s.removeChild(x)}else{x.removeChild(A)}z=p=parseFloat(z);return z},p,j=function(I){var x="clientWidth",B=s[x],H=w.compatMode==="CSS1Compat"&&B||w.body[x]||B,D={},G=b[b.length-1],z=(new Date()).getTime();if(I&&l&&z-l-1?(p||v()):1)}if(!!J){J=parseFloat(J)*(J.indexOf(y)>-1?(p||v()):1)}if(!K.hasquery||(!A||!L)&&(A||H>=C)&&(L||H<=J)){if(!D[K.media]){D[K.media]=[]}D[K.media].push(k[K.rules])}}for(var E in q){if(q[E]&&q[E].parentNode===f){f.removeChild(q[E])}}for(var E in D){var M=w.createElement("style"),F=D[E].join("\n");M.type="text/css";M.media=E;f.insertBefore(M,G.nextSibling);if(M.styleSheet){M.styleSheet.cssText=F}else{M.appendChild(w.createTextNode(F))}q.push(M)}},n=function(x,z){var y=c();if(!y){return}y.open("GET",x,true);y.onreadystatechange=function(){if(y.readyState!=4||y.status!=200&&y.status!=304){return}z(y.responseText)};if(y.readyState==4){return}y.send(null)},c=(function(){var x=false;try{x=new XMLHttpRequest()}catch(y){x=new ActiveXObject("Microsoft.XMLHTTP")}return function(){return x}})();a();respond.update=a;function t(){j(true)}if(e.addEventListener){e.addEventListener("resize",t,false)}else{if(e.attachEvent){e.attachEvent("onresize",t)}}})(this);
\ No newline at end of file
diff --git a/Fitbit.Portable.DebugSite/Views/Account/ConfirmEmail.cshtml b/Fitbit.Portable.DebugSite/Views/Account/ConfirmEmail.cshtml
deleted file mode 100644
index ed02ad87..00000000
--- a/Fitbit.Portable.DebugSite/Views/Account/ConfirmEmail.cshtml
+++ /dev/null
@@ -1,10 +0,0 @@
-@{
- ViewBag.Title = "Confirm Email";
-}
-
-@ViewBag.Title.
-
-
- Thank you for confirming your email. Please @Html.ActionLink("Click here to Log in", "Login", "Account", routeValues: null, htmlAttributes: new { id = "loginLink" })
-
-
diff --git a/Fitbit.Portable.DebugSite/Views/Account/ExternalLoginConfirmation.cshtml b/Fitbit.Portable.DebugSite/Views/Account/ExternalLoginConfirmation.cshtml
deleted file mode 100644
index 07ac80ff..00000000
--- a/Fitbit.Portable.DebugSite/Views/Account/ExternalLoginConfirmation.cshtml
+++ /dev/null
@@ -1,36 +0,0 @@
-@model SampleWebMVCOAuth2.Models.ExternalLoginConfirmationViewModel
-@{
- ViewBag.Title = "Register";
-}
-@ViewBag.Title.
-Associate your @ViewBag.LoginProvider account.
-
-@using (Html.BeginForm("ExternalLoginConfirmation", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
-{
- @Html.AntiForgeryToken()
-
- Association Form
-
- @Html.ValidationSummary(true, "", new { @class = "text-danger" })
-
- You've successfully authenticated with @ViewBag.LoginProvider.
- Please enter a user name for this site below and click the Register button to finish
- logging in.
-
-
-
-}
-
-@section Scripts {
- @Scripts.Render("~/bundles/jqueryval")
-}
diff --git a/Fitbit.Portable.DebugSite/Views/Account/ExternalLoginFailure.cshtml b/Fitbit.Portable.DebugSite/Views/Account/ExternalLoginFailure.cshtml
deleted file mode 100644
index 3be4ab37..00000000
--- a/Fitbit.Portable.DebugSite/Views/Account/ExternalLoginFailure.cshtml
+++ /dev/null
@@ -1,8 +0,0 @@
-@{
- ViewBag.Title = "Login Failure";
-}
-
-
- @ViewBag.Title.
- Unsuccessful login with service.
-
diff --git a/Fitbit.Portable.DebugSite/Views/Account/ForgotPassword.cshtml b/Fitbit.Portable.DebugSite/Views/Account/ForgotPassword.cshtml
deleted file mode 100644
index 58eefb0a..00000000
--- a/Fitbit.Portable.DebugSite/Views/Account/ForgotPassword.cshtml
+++ /dev/null
@@ -1,29 +0,0 @@
-@model SampleWebMVCOAuth2.Models.ForgotPasswordViewModel
-@{
- ViewBag.Title = "Forgot your password?";
-}
-
-@ViewBag.Title.
-
-@using (Html.BeginForm("ForgotPassword", "Account", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
-{
- @Html.AntiForgeryToken()
- Enter your email.
-
- @Html.ValidationSummary("", new { @class = "text-danger" })
-
-
-}
-
-@section Scripts {
- @Scripts.Render("~/bundles/jqueryval")
-}
diff --git a/Fitbit.Portable.DebugSite/Views/Account/ForgotPasswordConfirmation.cshtml b/Fitbit.Portable.DebugSite/Views/Account/ForgotPasswordConfirmation.cshtml
deleted file mode 100644
index dd7af8ca..00000000
--- a/Fitbit.Portable.DebugSite/Views/Account/ForgotPasswordConfirmation.cshtml
+++ /dev/null
@@ -1,13 +0,0 @@
-@{
- ViewBag.Title = "Forgot Password Confirmation";
-}
-
-
- @ViewBag.Title.
-
-
-
- Please check your email to reset your password.
-
-
-
diff --git a/Fitbit.Portable.DebugSite/Views/Account/Login.cshtml b/Fitbit.Portable.DebugSite/Views/Account/Login.cshtml
deleted file mode 100644
index 4e394b75..00000000
--- a/Fitbit.Portable.DebugSite/Views/Account/Login.cshtml
+++ /dev/null
@@ -1,63 +0,0 @@
-@using SampleWebMVCOAuth2.Models
-@model LoginViewModel
-@{
- ViewBag.Title = "Log in";
-}
-
-@ViewBag.Title.
-
-
-@section Scripts {
- @Scripts.Render("~/bundles/jqueryval")
-}
\ No newline at end of file
diff --git a/Fitbit.Portable.DebugSite/Views/Account/Register.cshtml b/Fitbit.Portable.DebugSite/Views/Account/Register.cshtml
deleted file mode 100644
index bf565d68..00000000
--- a/Fitbit.Portable.DebugSite/Views/Account/Register.cshtml
+++ /dev/null
@@ -1,41 +0,0 @@
-@model SampleWebMVCOAuth2.Models.RegisterViewModel
-@{
- ViewBag.Title = "Register";
-}
-
-@ViewBag.Title.
-
-@using (Html.BeginForm("Register", "Account", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
-{
- @Html.AntiForgeryToken()
- Create a new account.
-
- @Html.ValidationSummary("", new { @class = "text-danger" })
-
-
-
-
-}
-
-@section Scripts {
- @Scripts.Render("~/bundles/jqueryval")
-}
diff --git a/Fitbit.Portable.DebugSite/Views/Account/ResetPassword.cshtml b/Fitbit.Portable.DebugSite/Views/Account/ResetPassword.cshtml
deleted file mode 100644
index 5dd07e4d..00000000
--- a/Fitbit.Portable.DebugSite/Views/Account/ResetPassword.cshtml
+++ /dev/null
@@ -1,42 +0,0 @@
-@model SampleWebMVCOAuth2.Models.ResetPasswordViewModel
-@{
- ViewBag.Title = "Reset password";
-}
-
-@ViewBag.Title.
-
-@using (Html.BeginForm("ResetPassword", "Account", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
-{
- @Html.AntiForgeryToken()
- Reset your password.
-
- @Html.ValidationSummary("", new { @class = "text-danger" })
- @Html.HiddenFor(model => model.Code)
-
-
-
-
-}
-
-@section Scripts {
- @Scripts.Render("~/bundles/jqueryval")
-}
diff --git a/Fitbit.Portable.DebugSite/Views/Account/ResetPasswordConfirmation.cshtml b/Fitbit.Portable.DebugSite/Views/Account/ResetPasswordConfirmation.cshtml
deleted file mode 100644
index 38045161..00000000
--- a/Fitbit.Portable.DebugSite/Views/Account/ResetPasswordConfirmation.cshtml
+++ /dev/null
@@ -1,12 +0,0 @@
-@{
- ViewBag.Title = "Reset password confirmation";
-}
-
-
- @ViewBag.Title.
-
-
-
- Your password has been reset. Please @Html.ActionLink("click here to log in", "Login", "Account", routeValues: null, htmlAttributes: new { id = "loginLink" })
-
-
diff --git a/Fitbit.Portable.DebugSite/Views/Account/SendCode.cshtml b/Fitbit.Portable.DebugSite/Views/Account/SendCode.cshtml
deleted file mode 100644
index 99a51fdf..00000000
--- a/Fitbit.Portable.DebugSite/Views/Account/SendCode.cshtml
+++ /dev/null
@@ -1,24 +0,0 @@
-@model SampleWebMVCOAuth2.Models.SendCodeViewModel
-@{
- ViewBag.Title = "Send";
-}
-
-@ViewBag.Title.
-
-@using (Html.BeginForm("SendCode", "Account", new { ReturnUrl = Model.ReturnUrl }, FormMethod.Post, new { @class = "form-horizontal", role = "form" })) {
- @Html.AntiForgeryToken()
- @Html.Hidden("rememberMe", @Model.RememberMe)
- Send verification code
-
-
-
- Select Two-Factor Authentication Provider:
- @Html.DropDownListFor(model => model.SelectedProvider, Model.Providers)
-
-
-
-}
-
-@section Scripts {
- @Scripts.Render("~/bundles/jqueryval")
-}
diff --git a/Fitbit.Portable.DebugSite/Views/Account/VerifyCode.cshtml b/Fitbit.Portable.DebugSite/Views/Account/VerifyCode.cshtml
deleted file mode 100644
index ea483af3..00000000
--- a/Fitbit.Portable.DebugSite/Views/Account/VerifyCode.cshtml
+++ /dev/null
@@ -1,38 +0,0 @@
-@model SampleWebMVCOAuth2.Models.VerifyCodeViewModel
-@{
- ViewBag.Title = "Verify";
-}
-
-@ViewBag.Title.
-
-@using (Html.BeginForm("VerifyCode", "Account", new { ReturnUrl = Model.ReturnUrl }, FormMethod.Post, new { @class = "form-horizontal", role = "form" })) {
- @Html.AntiForgeryToken()
- @Html.Hidden("provider", @Model.Provider)
- @Html.Hidden("rememberMe", @Model.RememberMe)
- Enter verification code
-
- @Html.ValidationSummary("", new { @class = "text-danger" })
-
-
-
-}
-
-@section Scripts {
- @Scripts.Render("~/bundles/jqueryval")
-}
diff --git a/Fitbit.Portable.DebugSite/Views/Account/_ExternalLoginsListPartial.cshtml b/Fitbit.Portable.DebugSite/Views/Account/_ExternalLoginsListPartial.cshtml
deleted file mode 100644
index 9b98bada..00000000
--- a/Fitbit.Portable.DebugSite/Views/Account/_ExternalLoginsListPartial.cshtml
+++ /dev/null
@@ -1,28 +0,0 @@
-@model SampleWebMVCOAuth2.Models.ExternalLoginListViewModel
-@using Microsoft.Owin.Security
-
-Use another service to log in.
-
-@{
- var loginProviders = Context.GetOwinContext().Authentication.GetExternalAuthenticationTypes();
- if (loginProviders.Count() == 0) {
-
-
- There are no external authentication services configured. See this article
- for details on setting up this ASP.NET application to support logging in via external services.
-
-
- }
- else {
- using (Html.BeginForm("ExternalLogin", "Account", new { ReturnUrl = Model.ReturnUrl })) {
- @Html.AntiForgeryToken()
-
-
- @foreach (AuthenticationDescription p in loginProviders) {
-
- }
-
-
- }
- }
-}
diff --git a/Fitbit.Portable.DebugSite/Views/Home/Index.cshtml b/Fitbit.Portable.DebugSite/Views/Home/Index.cshtml
deleted file mode 100644
index d9b10ad7..00000000
--- a/Fitbit.Portable.DebugSite/Views/Home/Index.cshtml
+++ /dev/null
@@ -1,21 +0,0 @@
-@{
- ViewBag.Title = "Home Page";
-}
-
-
-
ASP.NET
-
ASP.NET is a free web framework for building great Web sites and Web applications using HTML, CSS and JavaScript.
-
Learn more »
-
-
-
- @if(ViewBag.AccessToken != null){
-
Token -- @ViewBag.Token
-
Token type -- @ViewBag.TokenType
-
Expires In -- @ViewBag.ExpiresIn
-
Refresh token -- @ViewBag.RefreshToken
-
- } else{
-
The current session has not been authenticated with fitbit
- }
-
\ No newline at end of file
diff --git a/Fitbit.Portable.DebugSite/Views/Manage/AddPhoneNumber.cshtml b/Fitbit.Portable.DebugSite/Views/Manage/AddPhoneNumber.cshtml
deleted file mode 100644
index 36659d70..00000000
--- a/Fitbit.Portable.DebugSite/Views/Manage/AddPhoneNumber.cshtml
+++ /dev/null
@@ -1,29 +0,0 @@
-@model SampleWebMVCOAuth2.Models.AddPhoneNumberViewModel
-@{
- ViewBag.Title = "Phone Number";
-}
-
-@ViewBag.Title.
-
-@using (Html.BeginForm("AddPhoneNumber", "Manage", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
-{
- @Html.AntiForgeryToken()
- Add a phone number
-
- @Html.ValidationSummary("", new { @class = "text-danger" })
-
-
-}
-
-@section Scripts {
- @Scripts.Render("~/bundles/jqueryval")
-}
diff --git a/Fitbit.Portable.DebugSite/Views/Manage/ChangePassword.cshtml b/Fitbit.Portable.DebugSite/Views/Manage/ChangePassword.cshtml
deleted file mode 100644
index 73bb04e0..00000000
--- a/Fitbit.Portable.DebugSite/Views/Manage/ChangePassword.cshtml
+++ /dev/null
@@ -1,40 +0,0 @@
-@model SampleWebMVCOAuth2.Models.ChangePasswordViewModel
-@{
- ViewBag.Title = "Change Password";
-}
-
-@ViewBag.Title.
-
-@using (Html.BeginForm("ChangePassword", "Manage", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
-{
- @Html.AntiForgeryToken()
- Change Password Form
-
- @Html.ValidationSummary("", new { @class = "text-danger" })
-
-
-
-
-}
-@section Scripts {
- @Scripts.Render("~/bundles/jqueryval")
-}
\ No newline at end of file
diff --git a/Fitbit.Portable.DebugSite/Views/Manage/Index.cshtml b/Fitbit.Portable.DebugSite/Views/Manage/Index.cshtml
deleted file mode 100644
index 80696604..00000000
--- a/Fitbit.Portable.DebugSite/Views/Manage/Index.cshtml
+++ /dev/null
@@ -1,84 +0,0 @@
-@model SampleWebMVCOAuth2.Models.IndexViewModel
-@{
- ViewBag.Title = "Manage";
-}
-
-@ViewBag.Title.
-
-@ViewBag.StatusMessage
-
-
Change your account settings
-
-
- - Password:
- -
- [
- @if (Model.HasPassword)
- {
- @Html.ActionLink("Change your password", "ChangePassword")
- }
- else
- {
- @Html.ActionLink("Create", "SetPassword")
- }
- ]
-
- - External Logins:
- -
- @Model.Logins.Count [
- @Html.ActionLink("Manage", "ManageLogins") ]
-
- @*
- Phone Numbers can used as a second factor of verification in a two-factor authentication system.
-
- See this article
- for details on setting up this ASP.NET application to support two-factor authentication using SMS.
-
- Uncomment the following block after you have set up two-factor authentication
- *@
- @*
- - Phone Number:
- -
- @(Model.PhoneNumber ?? "None") [
- @if (Model.PhoneNumber != null)
- {
- @Html.ActionLink("Change", "AddPhoneNumber")
- @: |
- @Html.ActionLink("Remove", "RemovePhoneNumber")
- }
- else
- {
- @Html.ActionLink("Add", "AddPhoneNumber")
- }
- ]
-
- *@
- - Two-Factor Authentication:
- -
-
- There are no two-factor authentication providers configured. See this article
- for details on setting up this ASP.NET application to support two-factor authentication.
-
- @*@if (Model.TwoFactor)
- {
- using (Html.BeginForm("DisableTwoFactorAuthentication", "Manage", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
- {
- @Html.AntiForgeryToken()
- Enabled
-
-
- }
- }
- else
- {
- using (Html.BeginForm("EnableTwoFactorAuthentication", "Manage", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
- {
- @Html.AntiForgeryToken()
- Disabled
-
-
- }
- }*@
-
-
-
diff --git a/Fitbit.Portable.DebugSite/Views/Manage/ManageLogins.cshtml b/Fitbit.Portable.DebugSite/Views/Manage/ManageLogins.cshtml
deleted file mode 100644
index 58018a00..00000000
--- a/Fitbit.Portable.DebugSite/Views/Manage/ManageLogins.cshtml
+++ /dev/null
@@ -1,70 +0,0 @@
-@model SampleWebMVCOAuth2.Models.ManageLoginsViewModel
-@using Microsoft.Owin.Security
-@{
- ViewBag.Title = "Manage your external logins";
-}
-
-@ViewBag.Title.
-
-@ViewBag.StatusMessage
-@{
- var loginProviders = Context.GetOwinContext().Authentication.GetExternalAuthenticationTypes();
- if (loginProviders.Count() == 0) {
-
-
- There are no external authentication services configured. See this article
- for details on setting up this ASP.NET application to support logging in via external services.
-
-
- }
- else
- {
- if (Model.CurrentLogins.Count > 0)
- {
- Registered Logins
-
- }
- if (Model.OtherLogins.Count > 0)
- {
- using (Html.BeginForm("LinkLogin", "Manage"))
- {
- @Html.AntiForgeryToken()
-
-
- @foreach (AuthenticationDescription p in Model.OtherLogins)
- {
-
- }
-
-
- }
- }
- }
-}
diff --git a/Fitbit.Portable.DebugSite/Views/Manage/SetPassword.cshtml b/Fitbit.Portable.DebugSite/Views/Manage/SetPassword.cshtml
deleted file mode 100644
index a14f6302..00000000
--- a/Fitbit.Portable.DebugSite/Views/Manage/SetPassword.cshtml
+++ /dev/null
@@ -1,39 +0,0 @@
-@model SampleWebMVCOAuth2.Models.SetPasswordViewModel
-@{
- ViewBag.Title = "Create Password";
-}
-
-@ViewBag.Title.
-
- You do not have a local username/password for this site. Add a local
- account so you can log in without an external login.
-
-
-@using (Html.BeginForm("SetPassword", "Manage", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
-{
- @Html.AntiForgeryToken()
-
- Create Local Login
-
- @Html.ValidationSummary("", new { @class = "text-danger" })
-
-
-
-}
-@section Scripts {
- @Scripts.Render("~/bundles/jqueryval")
-}
\ No newline at end of file
diff --git a/Fitbit.Portable.DebugSite/Views/Manage/VerifyPhoneNumber.cshtml b/Fitbit.Portable.DebugSite/Views/Manage/VerifyPhoneNumber.cshtml
deleted file mode 100644
index 3b2d462f..00000000
--- a/Fitbit.Portable.DebugSite/Views/Manage/VerifyPhoneNumber.cshtml
+++ /dev/null
@@ -1,31 +0,0 @@
-@model SampleWebMVCOAuth2.Models.VerifyPhoneNumberViewModel
-@{
- ViewBag.Title = "Verify Phone Number";
-}
-
-@ViewBag.Title.
-
-@using (Html.BeginForm("VerifyPhoneNumber", "Manage", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
-{
- @Html.AntiForgeryToken()
- @Html.Hidden("phoneNumber", @Model.PhoneNumber)
- Enter verification code
- @ViewBag.Status
-
- @Html.ValidationSummary("", new { @class = "text-danger" })
-
-
-}
-
-@section Scripts {
- @Scripts.Render("~/bundles/jqueryval")
-}
diff --git a/Fitbit.Portable.DebugSite/Web.config b/Fitbit.Portable.DebugSite/Web.config
deleted file mode 100644
index 2fd4b54f..00000000
--- a/Fitbit.Portable.DebugSite/Web.config
+++ /dev/null
@@ -1,99 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/Fitbit.Portable.DebugSite/packages.config b/Fitbit.Portable.DebugSite/packages.config
deleted file mode 100644
index 2f60636a..00000000
--- a/Fitbit.Portable.DebugSite/packages.config
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/Fitbit.Portable.Tests/AccessTokenTests.cs b/Fitbit.Portable.Tests/AccessTokenTests.cs
index d2570b91..662f082f 100644
--- a/Fitbit.Portable.Tests/AccessTokenTests.cs
+++ b/Fitbit.Portable.Tests/AccessTokenTests.cs
@@ -4,7 +4,7 @@
using Fitbit.Api.Portable.OAuth2;
using FluentAssertions;
using NUnit.Framework;
-using Ploeh.AutoFixture;
+using AutoFixture;
namespace Fitbit.Portable.Tests
{
diff --git a/Fitbit.Portable.Tests/ActivityLogTests.cs b/Fitbit.Portable.Tests/ActivityLogTests.cs
new file mode 100644
index 00000000..8b282742
--- /dev/null
+++ b/Fitbit.Portable.Tests/ActivityLogTests.cs
@@ -0,0 +1,170 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net;
+using System.Net.Http;
+using System.Threading;
+using System.Threading.Tasks;
+using Fitbit.Api.Portable;
+using Fitbit.Api.Portable.Models;
+using Fitbit.Models;
+using FluentAssertions;
+using Newtonsoft.Json;
+using NUnit.Framework;
+
+namespace Fitbit.Portable.Tests
+{
+ [TestFixture]
+ public class ActivityLogTests
+ {
+ [Test]
+ [Category("Portable")]
+ public async Task GetActivityLogsListAsync_Success()
+ {
+ string content = SampleDataHelper.GetContent("GetActivityLogsList.json");
+
+ var responseMessage = new Func(() => new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent(content) });
+
+ var verification = new Action((message, token) =>
+ {
+ Assert.AreEqual(HttpMethod.Get, message.Method);
+ Assert.AreEqual("https://api.fitbit.com/1/user/-/activities/list.json?afterDate=2017-01-01&sort=asc&limit=20&offset=0", message.RequestUri.AbsoluteUri);
+ });
+
+ var fitbitClient = Helper.CreateFitbitClient(responseMessage, verification);
+
+ var response = await fitbitClient.GetActivityLogsListAsync(null, new DateTime(2017, 1, 1));
+ ValidateActivity(response.Activities);
+ }
+
+ [Test]
+ [Category("Portable")]
+ public void GetActivityLogsListAsync_Errors()
+ {
+ var responseMessage = Helper.CreateErrorResponse(HttpStatusCode.BadRequest);
+ var verification = new Action((message, token) =>
+ {
+ Assert.AreEqual(HttpMethod.Get, message.Method);
+ });
+
+ var fitbitClient = Helper.CreateFitbitClient(responseMessage, verification);
+
+ Func> result = () => fitbitClient.GetActivityLogsListAsync(null, new DateTime(2017, 1, 1));
+
+ result.Should().Throw().Which.ApiErrors.Count.Should().Be(1);
+ }
+
+ [Test]
+ [Category("Portable")]
+ public void ActivityLogsList_JsonParse_Errors()
+ {
+ string content = SampleDataHelper.GetContent("GetActivityLogsList2.json");
+ var settings = new JsonSerializerSettings() { DateParseHandling = DateParseHandling.DateTimeOffset };
+ var serializer = new JsonDotNetSerializer(settings) { RootProperty = "activities" };
+
+ try
+ {
+ serializer.Deserialize(content);
+ }
+ catch (FitbitParseException e){
+ // Success
+ }
+ catch (Exception e)
+ {
+ Assert.Fail();
+ }
+
+ }
+
+ [Test]
+ [Category("Portable")]
+ public void Can_Deserialize_ActivityLogsList()
+ {
+ string content = SampleDataHelper.GetContent("GetActivityLogsList.json");
+ var settings = new JsonSerializerSettings { DateParseHandling = DateParseHandling.DateTimeOffset };
+ ActivityLogsList logList = JsonConvert.DeserializeObject(content, settings);
+
+ ValidateActivity(logList.Activities);
+ }
+
+ [Test]
+ [Category("Portable")]
+ public async Task Get_Multiple_ActivityLogsList()
+ {
+ var response = await GetActivityLogsList2(new DateTime(2017, 9, 4));
+ response.Activities.Count.Should().Be(2);
+ }
+
+ [Test]
+ [Category("Portable")]
+ public async Task Check_TimeZone_ActivityLogsList()
+ {
+ var response = await GetActivityLogsList2(new DateTime(2017, 9, 4));
+ const string origOffset = "-07:00:00";
+
+ response.Activities[0].StartTime.Offset.ToString().Should().Be(origOffset);
+ response.Activities[1].StartTime.Offset.ToString().Should().Be(origOffset);
+ }
+
+ private async Task GetActivityLogsList2(DateTime date)
+ {
+ string content = SampleDataHelper.GetContent("GetActivityLogsList2.json");
+ var responseMessage = new Func(() => new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent(content) });
+
+ var verification = new Action((message, token) =>
+ {
+ Assert.AreEqual(HttpMethod.Get, message.Method);
+ Assert.AreEqual("https://api.fitbit.com/1/user/-/activities/list.json?afterDate=2017-09-04&sort=asc&limit=20&offset=0", message.RequestUri.AbsoluteUri);
+ });
+
+ var fitbitClient = Helper.CreateFitbitClient(responseMessage, verification);
+
+ var response = await fitbitClient.GetActivityLogsListAsync(date);
+ return response;
+ }
+
+ private void ValidateActivity(List stats)
+ {
+ var stat = stats.First();
+
+ stat.ActiveDuration.Should().Be(2764000);
+ stat.ActivityLevel.First().Minutes.Should().Be(0);
+ stat.ActivityLevel.First().Name.Should().Be("sedentary");
+ stat.ActivityName.Should().Be("Walk");
+ stat.ActivityTypeId.Should().Be(90013);
+ stat.AverageHeartRate.Should().Be(108);
+ stat.Calories.Should().Be(375);
+ stat.Duration.Should().Be(2764000);
+ stat.ElevationGain.Should().Be(3.048);
+
+ var zone1 = stat.HeartRateZones[0];
+ zone1.CaloriesOut.Should().Be(default(double));
+ zone1.Max.Should().Be(95);
+ zone1.Min.Should().Be(30);
+ zone1.Minutes.Should().Be(3);
+ zone1.Name.Should().Be("Out of Range");
+
+ var zone4 = stat.HeartRateZones[3];
+ zone4.CaloriesOut.Should().Be(default(double));
+ zone4.Max.Should().Be(220);
+ zone4.Min.Should().Be(162);
+ zone4.Minutes.Should().Be(0);
+ zone4.Name.Should().Be("Peak");
+
+ stat.LastModified.Should().Be(new DateTime(2017, 01, 01, 5, 3, 50));
+ stat.LogId.Should().Be(5390522508);
+ stat.LogType.Should().Be("auto_detected");
+
+ stat.ManualValuesSpecified.Calories.Should().Be(false);
+ stat.ManualValuesSpecified.Distance.Should().Be(false);
+ stat.ManualValuesSpecified.Steps.Should().Be(false);
+
+ stat.OriginalDuration.Should().Be(2764000);
+ stat.OriginalStartTime.Should().Be(new DateTime(2017, 1, 1, 4, 14, 06));
+ stat.StartTime.Should().Be(new DateTime(2017, 1, 1, 4, 14, 06));
+ stat.Steps.Should().Be(5138);
+ stat.TcxLink.Should().Be("https://api.fitbit.com/1/user/-/activities/5390522508.tcx");
+ }
+ }
+}
+
diff --git a/Fitbit.Portable.Tests/BloodPressureTests.cs b/Fitbit.Portable.Tests/BloodPressureTests.cs
index a259248c..f171cfd2 100644
--- a/Fitbit.Portable.Tests/BloodPressureTests.cs
+++ b/Fitbit.Portable.Tests/BloodPressureTests.cs
@@ -49,7 +49,7 @@ public void GetBloodPressureAsync_Errors()
Func> result = () => fitbitClient.GetBloodPressureAsync(new DateTime(2014, 9, 27));
- result.ShouldThrow().Which.ApiErrors.Count.Should().Be(1);
+ result.Should().Throw().Which.ApiErrors.Count.Should().Be(1);
}
[Test] [Category("Portable")]
diff --git a/Fitbit.Portable.Tests/BodyMeasurementTests.cs b/Fitbit.Portable.Tests/BodyMeasurementTests.cs
index b5bf4e68..387e7c8e 100644
--- a/Fitbit.Portable.Tests/BodyMeasurementTests.cs
+++ b/Fitbit.Portable.Tests/BodyMeasurementTests.cs
@@ -49,7 +49,7 @@ public void GetBodyMeasurementsAsync_Errors()
Func> result = () => fitbitClient.GetBodyMeasurementsAsync(new DateTime(2014, 9, 27));
- result.ShouldThrow().Which.ApiErrors.Count.Should().Be(1);
+ result.Should().Throw().Which.ApiErrors.Count.Should().Be(1);
}
[Test] [Category("Portable")]
diff --git a/Fitbit.Portable.Tests/DayActivityTests.cs b/Fitbit.Portable.Tests/DayActivityTests.cs
index 114b76cb..dcebdc4f 100644
--- a/Fitbit.Portable.Tests/DayActivityTests.cs
+++ b/Fitbit.Portable.Tests/DayActivityTests.cs
@@ -50,7 +50,7 @@ public void GetDayActivityAsync_Errors()
Func> result = () => fitbitClient.GetDayActivityAsync(new DateTime(2014, 9, 27));
- result.ShouldThrow().Which.ApiErrors.Count.Should().Be(1);
+ result.Should().Throw().Which.ApiErrors.Count.Should().Be(1);
}
[Test] [Category("Portable")]
@@ -89,7 +89,7 @@ public void GetDayActivitySummaryAsync_Errors()
Func> result = () => fitbitClient.GetDayActivityAsync(new DateTime(2014, 9, 27));
- result.ShouldThrow().Which.ApiErrors.Count.Should().Be(1);
+ result.Should().Throw().Which.ApiErrors.Count.Should().Be(1);
}
[Test] [Category("Portable")]
@@ -203,7 +203,7 @@ private void ValidateActivitySummary(ActivitySummary summary)
Assert.AreEqual(1198, summary.HeartRateZones[0].Minutes);
Assert.AreEqual(30, summary.HeartRateZones[0].Min);
Assert.AreEqual(94, summary.HeartRateZones[0].Max);
- Assert.AreEqual(1594.36823f, summary.HeartRateZones[0].CaloriesOut);
+ Assert.AreEqual(1594.36823, summary.HeartRateZones[0].CaloriesOut);
// distances
var d = summary.Distances.First(x => x.Activity == "total");
diff --git a/Fitbit.Portable.Tests/DeviceTests.cs b/Fitbit.Portable.Tests/DeviceTests.cs
index 382b446a..6c49ad62 100644
--- a/Fitbit.Portable.Tests/DeviceTests.cs
+++ b/Fitbit.Portable.Tests/DeviceTests.cs
@@ -75,7 +75,7 @@ public void GetDevicesAsync_Failure_Errors()
Func>> result = () => fitbitClient.GetDevicesAsync();
- result.ShouldThrow();
+ result.Should().Throw();
}
[Test] [Category("Portable")]
diff --git a/Fitbit.Portable.Tests/FatTests.cs b/Fitbit.Portable.Tests/FatTests.cs
index 1aead3b9..ff4893c9 100644
--- a/Fitbit.Portable.Tests/FatTests.cs
+++ b/Fitbit.Portable.Tests/FatTests.cs
@@ -3,11 +3,11 @@
using System.Net;
using System.Net.Http;
using System.Threading;
-using Fitbit.Api.Portable;
-using Fitbit.Models;
using NUnit.Framework;
-using Ploeh.AutoFixture;
+using AutoFixture;
using System.Threading.Tasks;
+using Fitbit.Api.Portable;
+using Fitbit.Models;
namespace Fitbit.Portable.Tests
{
@@ -16,7 +16,7 @@ public class FatTests
{
public Fixture fixture { get; set; }
- [TestFixtureSetUp]
+ [OneTimeSetUp]
public void Init()
{
fixture = new Fixture();
diff --git a/Fitbit.Portable.Tests/Fitbit.Portable.Tests.csproj b/Fitbit.Portable.Tests/Fitbit.Portable.Tests.csproj
index 54fb4182..2a2b2de2 100644
--- a/Fitbit.Portable.Tests/Fitbit.Portable.Tests.csproj
+++ b/Fitbit.Portable.Tests/Fitbit.Portable.Tests.csproj
@@ -1,354 +1,150 @@
-
-
-
+
+
- Debug
- AnyCPU
- {F811594D-3323-4147-9780-D3A1F930B99F}
- Library
- Properties
- Fitbit.Portable.Tests
- Fitbit.Portable.Tests
- v4.5
- 512
- {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
- 10.0
- $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)
- $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages
- False
- UnitTest
- ..\Fitbit\
-
-
+ netcoreapp2.1;netcoreapp2.2;net461
-
- true
- full
- false
- bin\Debug\
- TRACE;DEBUG;REQUIRES_JSONNET
- prompt
- 4
-
-
- pdbonly
- true
- bin\Release\
- TRACE
- prompt
- 4
-
-
-
- ..\Fitbit\packages\Castle.Core.4.1.1\lib\net45\Castle.Core.dll
-
-
- ..\Fitbit\packages\FluentAssertions.4.19.3\lib\net45\FluentAssertions.dll
-
-
- ..\Fitbit\packages\FluentAssertions.4.19.3\lib\net45\FluentAssertions.Core.dll
-
-
- ..\Fitbit\packages\Moq.4.7.99\lib\net45\Moq.dll
-
-
- ..\Fitbit\packages\Newtonsoft.Json.8.0.2\lib\net45\Newtonsoft.Json.dll
- True
-
-
- ..\Fitbit\packages\NUnit.3.7.1\lib\net45\nunit.framework.dll
-
-
- ..\Fitbit\packages\AutoFixture.3.50.3\lib\net40\Ploeh.AutoFixture.dll
-
-
-
-
-
- ..\Fitbit\packages\Microsoft.Net.Http.2.2.29\lib\net45\System.Net.Http.Extensions.dll
-
-
- ..\Fitbit\packages\Microsoft.Net.Http.2.2.29\lib\net45\System.Net.Http.Primitives.dll
-
-
- ..\Fitbit\packages\Microsoft.Bcl.1.1.10\lib\portable-net40+sl5+win8+wp8+wpa81\System.Threading.Tasks.dll
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
-
-
+
+
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
-
-
- PreserveNewest
-
-
-
-
- {1358d3b4-0698-4003-97eb-b6d489e04138}
- Fitbit.Portable
-
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
-
-
-
-
- False
-
-
- False
-
-
- False
-
-
- False
-
-
-
-
-
-
-
-
- This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
-
-
-
-
+
\ No newline at end of file
diff --git a/Fitbit.Portable.Tests/FitbitResponseTests.cs b/Fitbit.Portable.Tests/FitbitResponseTests.cs
index ee492e67..e3e8c4c5 100644
--- a/Fitbit.Portable.Tests/FitbitResponseTests.cs
+++ b/Fitbit.Portable.Tests/FitbitResponseTests.cs
@@ -1,87 +1,87 @@
-using System;
-using System.Net;
-using System.Net.Http;
-using Fitbit.Api.Portable;
-using NUnit.Framework;
+//using System;
+//using System.Net;
+//using System.Net.Http;
+//using Fitbit.Api.Portable;
+//using NUnit.Framework;
-namespace Fitbit.Portable.Tests
-{
- [TestFixture]
- public class FitbitResponseTests
- {
- [Test] [Category("Portable")]
- public void RetryAfter_No_Status_Applicable()
- {
- var response = new FitbitResponse(HttpStatusCode.OK, null, null);
- Assert.AreEqual(0, response.RetryAfter());
- }
+//namespace Fitbit.Portable.Tests
+//{
+// [TestFixture]
+// public class FitbitResponseTests
+// {
+// [Test] [Category("Portable")]
+// public void RetryAfter_No_Status_Applicable()
+// {
+// var response = new FitbitResponse(HttpStatusCode.OK, null, null);
+// Assert.AreEqual(0, response.RetryAfter());
+// }
- [Test] [Category("Portable")]
- public void RetryAfter_NoRetryHeader()
- {
- var headers = new HttpResponseMessage().Headers;
- var response = new FitbitResponse((HttpStatusCode)429, headers, null);
- Assert.AreEqual(0, response.RetryAfter());
- }
+// [Test] [Category("Portable")]
+// public void RetryAfter_NoRetryHeader()
+// {
+// var headers = new HttpResponseMessage().Headers;
+// var response = new FitbitResponse((HttpStatusCode)429, headers, null);
+// Assert.AreEqual(0, response.RetryAfter());
+// }
- [Test] [Category("Portable")]
- public void RetryAfter_RetryHeader_NoValue()
- {
- var headers = new HttpResponseMessage().Headers;
- headers.Add("Retry-After", new string[0]);
- var response = new FitbitResponse((HttpStatusCode)429, headers, null);
- Assert.AreEqual(0, response.RetryAfter());
- }
+// [Test] [Category("Portable")]
+// public void RetryAfter_RetryHeader_NoValue()
+// {
+// var headers = new HttpResponseMessage().Headers;
+// headers.Add("Retry-After", new string[0]);
+// var response = new FitbitResponse((HttpStatusCode)429, headers, null);
+// Assert.AreEqual(0, response.RetryAfter());
+// }
- [Test] [Category("Portable")]
- public void RetryAfter_RetryHeader_100()
- {
- var headers = new HttpResponseMessage().Headers;
- headers.Add("Retry-After", "100");
- var response = new FitbitResponse((HttpStatusCode)429, headers, null);
- Assert.AreEqual(100, response.RetryAfter());
- }
+// [Test] [Category("Portable")]
+// public void RetryAfter_RetryHeader_100()
+// {
+// var headers = new HttpResponseMessage().Headers;
+// headers.Add("Retry-After", "100");
+// var response = new FitbitResponse((HttpStatusCode)429, headers, null);
+// Assert.AreEqual(100, response.RetryAfter());
+// }
- //status tests - https://wiki.fitbit.com/display/API/API+Response+Format+And+Errors
- [Test] [Category("Portable")]
- public void NoContent()
- {
- var response = new FitbitResponse(HttpStatusCode.NoContent);
- Assert.IsTrue(response.Success);
- }
+// //status tests - https://wiki.fitbit.com/display/API/API+Response+Format+And+Errors
+// [Test] [Category("Portable")]
+// public void NoContent()
+// {
+// var response = new FitbitResponse(HttpStatusCode.NoContent);
+// Assert.IsTrue(response.Success);
+// }
- [Test] [Category("Portable")]
- public void Created()
- {
- var response = new FitbitResponse(HttpStatusCode.Created);
- Assert.IsTrue(response.Success);
- }
+// [Test] [Category("Portable")]
+// public void Created()
+// {
+// var response = new FitbitResponse(HttpStatusCode.Created);
+// Assert.IsTrue(response.Success);
+// }
- [Test] [Category("Portable")]
- public void Ok()
- {
- var response = new FitbitResponse(HttpStatusCode.OK);
- Assert.IsTrue(response.Success);
- }
+// [Test] [Category("Portable")]
+// public void Ok()
+// {
+// var response = new FitbitResponse(HttpStatusCode.OK);
+// Assert.IsTrue(response.Success);
+// }
- [Test] [Category("Portable")]
- public void AnyOther()
- {
- foreach (HttpStatusCode value in Enum.GetValues(typeof (HttpStatusCode)))
- {
- switch (value)
- {
- case HttpStatusCode.NoContent:
- case HttpStatusCode.Created:
- case HttpStatusCode.OK:
- break;
+// [Test] [Category("Portable")]
+// public void AnyOther()
+// {
+// foreach (HttpStatusCode value in Enum.GetValues(typeof (HttpStatusCode)))
+// {
+// switch (value)
+// {
+// case HttpStatusCode.NoContent:
+// case HttpStatusCode.Created:
+// case HttpStatusCode.OK:
+// break;
- default:
- var response = new FitbitResponse(value);
- Assert.IsFalse(response.Success);
- break;
- }
- }
- }
- }
-}
+// default:
+// var response = new FitbitResponse(value);
+// Assert.IsFalse(response.Success);
+// break;
+// }
+// }
+// }
+// }
+//}
diff --git a/Fitbit.Portable.Tests/FoodTests.cs b/Fitbit.Portable.Tests/FoodTests.cs
index 4e48ff48..2b1d4dad 100644
--- a/Fitbit.Portable.Tests/FoodTests.cs
+++ b/Fitbit.Portable.Tests/FoodTests.cs
@@ -50,7 +50,7 @@ public void GetFoodAsync_Errors()
Func> result = () => fitbitClient.GetFoodAsync(new DateTime(2014, 9, 27));
- result.ShouldThrow();
+ result.Should().Throw();
}
[Test] [Category("Portable")]
diff --git a/Fitbit.Portable.Tests/FriendsTests.cs b/Fitbit.Portable.Tests/FriendsTests.cs
index a4577b07..6254ed85 100644
--- a/Fitbit.Portable.Tests/FriendsTests.cs
+++ b/Fitbit.Portable.Tests/FriendsTests.cs
@@ -78,7 +78,7 @@ public void GetFriendsAsync_Failure_Errors()
Func>> result = () => fitbitClient.GetFriendsAsync();
- result.ShouldThrow();
+ result.Should().Throw();
}
[Test]
diff --git a/Fitbit.Portable.Tests/GoalsTests.cs b/Fitbit.Portable.Tests/GoalsTests.cs
index 925fcb90..eb4be89e 100644
--- a/Fitbit.Portable.Tests/GoalsTests.cs
+++ b/Fitbit.Portable.Tests/GoalsTests.cs
@@ -4,7 +4,7 @@
using System.Threading;
using Fitbit.Api.Portable;
using NUnit.Framework;
-using Ploeh.AutoFixture;
+using AutoFixture;
using System.Threading.Tasks;
namespace Fitbit.Portable.Tests
diff --git a/Fitbit.Portable.Tests/HeartRateTests.cs b/Fitbit.Portable.Tests/HeartRateTests.cs
new file mode 100644
index 00000000..84a9b18f
--- /dev/null
+++ b/Fitbit.Portable.Tests/HeartRateTests.cs
@@ -0,0 +1,197 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net;
+using System.Net.Http;
+using System.Threading;
+using System.Threading.Tasks;
+using Fitbit.Api.Portable;
+using Fitbit.Api.Portable.Models;
+using Fitbit.Models;
+using FluentAssertions;
+using Newtonsoft.Json;
+using NUnit.Framework;
+
+namespace Fitbit.Portable.Tests
+{
+ [TestFixture]
+ public class HeartRateTests
+ {
+ [Test]
+ [Category("Portable")]
+ public async Task GetHeartRateTimeSeriesAsync_Success()
+ {
+ string content = SampleDataHelper.GetContent("GetHeartRateTimeSeries.json");
+
+ var responseMessage = new Func(() => new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent(content) });
+
+ var verification = new Action((message, token) =>
+ {
+ var uri = $"https:/" + $"/api.fitbit.com/1.1/user/-/activities/heart/date/{DateTime.Today:yyyy-MM-dd}/1d.json";
+ Assert.AreEqual(HttpMethod.Get, message.Method);
+ Assert.AreEqual(uri, message.RequestUri.AbsoluteUri);
+ });
+
+ var fitbitClient = Helper.CreateFitbitClient(responseMessage, verification);
+
+ var response = await fitbitClient.GetHeartRateTimeSeries(DateTime.Today, DateRangePeriod.OneDay);
+ ValidateHeartRateTimeSeriesData(response);
+ }
+
+ [Test]
+ [Category("Portable")]
+ public void GetHeartRateTimeSeriesAsync_Errors()
+ {
+ var responseMessage = Helper.CreateErrorResponse(HttpStatusCode.BadRequest);
+ var verification = new Action((message, token) =>
+ {
+ Assert.AreEqual(HttpMethod.Get, message.Method);
+ });
+
+ var fitbitClient = Helper.CreateFitbitClient(responseMessage, verification);
+
+ Func> result = () => fitbitClient.GetHeartRateTimeSeries(DateTime.MinValue, DateRangePeriod.OneDay);
+
+ result.Should().Throw().Which.ApiErrors.Count.Should().Be(1);
+ }
+
+ [Test]
+ [Category("Portable")]
+ public void Can_Deserialize_HeartRateTimeSeries()
+ {
+ //assemble
+ string content = SampleDataHelper.GetContent("GetHeartRateTimeSeries.json");
+ var seralizer = new JsonDotNetSerializer();
+
+ //act
+ var stats = seralizer.GetHeartActivitiesTimeSeries(content);
+
+ //assert
+ ValidateHeartRateTimeSeriesData(stats);
+ }
+
+ [Test]
+ [Category("Portable")]
+ public async Task GetHeartRateIntradayTimeSeriesAsync_Success()
+ {
+ string content = SampleDataHelper.GetContent("GetHeartRateIntradayTimeSeries1.1.json");
+
+ var responseMessage = new Func(() => new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent(content) });
+
+ var verification = new Action((message, token) =>
+ {
+ var uri = $"https:/" + $"/api.fitbit.com/1.1/user/-/activities/heart/date/{DateTime.Today:yyyy-MM-dd}/{DateTime.Today:yyyy-MM-dd}/15min/time/00:00:00/23:59:59.json";
+ Assert.AreEqual(HttpMethod.Get, message.Method);
+ Assert.AreEqual(uri, message.RequestUri.AbsoluteUri);
+ });
+
+ var fitbitClient = Helper.CreateFitbitClient(responseMessage, verification);
+
+ var response = await fitbitClient.GetHeartRateIntraday(DateTime.Today, HeartRateResolution.fifteenMinute);
+ ValidateHeartRateIntradayTimeSeriesData(response);
+ }
+
+ [Test]
+ [Category("Portable")]
+ public void GetHeartRateIntradayTimeSeriesAsync_Errors()
+ {
+ var responseMessage = Helper.CreateErrorResponse(HttpStatusCode.BadRequest);
+ var verification = new Action((message, token) =>
+ {
+ Assert.AreEqual(HttpMethod.Get, message.Method);
+ });
+
+ var fitbitClient = Helper.CreateFitbitClient(responseMessage, verification);
+
+ Func> result = () => fitbitClient.GetHeartRateIntraday(DateTime.MinValue, HeartRateResolution.fifteenMinute);
+
+ result.Should().Throw().Which.ApiErrors.Count.Should().Be(1);
+ }
+
+ [Test]
+ [Category("Portable")]
+ public void Can_Deserialize_HeartRateIntradayTimeSeries()
+ {
+ //assemble
+ string content = SampleDataHelper.GetContent("GetHeartRateIntradayTimeSeries1.1.json");
+ DateTime date = DateTime.Parse("2017-08-21"); //hardcoded because extension expects a date. In any other use case, a date would be available
+ var seralizer = new JsonDotNetSerializer();
+
+ //act
+ var stats = seralizer.GetHeartRateIntraday(date, content);
+
+ //assert
+ ValidateHeartRateIntradayTimeSeriesData(stats);
+ }
+
+ private void ValidateHeartRateIntradayTimeSeriesData(HeartActivitiesIntraday activity)
+ {
+ //Activities Heart Intraday
+ var actIntraday = activity;
+
+ actIntraday.Dataset.Count().Should().Be(96); //Dataset count
+
+ actIntraday.Dataset[0].Time.TimeOfDay.Should().Be(new TimeSpan(0,0,0,0)); //First entry
+ actIntraday.Dataset[0].Value.Should().Be(57);
+
+ actIntraday.Dataset[95].Time.TimeOfDay.Should().Be(new TimeSpan(0, 23,45, 0)); //Last entry
+ actIntraday.Dataset[95].Value.Should().Be(47);
+
+ actIntraday.DatasetInterval.Should().Be(15); //Dataset interval
+
+ actIntraday.DatasetType.Should().Be("minute"); //Dataset Type
+
+ //Activities Heart
+ var act = activity.ActivitiesHeart;
+
+ act.DateTime.Should().Be(new DateTime(2017, 8, 21)); //DateTime
+
+ act.HeartRateZones.Count().Should().Be(4); //Zones Count
+
+ act.HeartRateZones[0].CaloriesOut.Should().Be(2071.96748); //First zone
+ act.HeartRateZones[0].Max.Should().Be(92);
+ act.HeartRateZones[0].Min.Should().Be(30);
+ act.HeartRateZones[0].Minutes.Should().Be(1387);
+ act.HeartRateZones[0].Name.Should().Be("Out of Range");
+
+ act.HeartRateZones[3].CaloriesOut.Should().Be(186.84666); //Last zone
+ act.HeartRateZones[3].Max.Should().Be(220);
+ act.HeartRateZones[3].Min.Should().Be(156);
+ act.HeartRateZones[3].Minutes.Should().Be(14);
+ act.HeartRateZones[3].Name.Should().Be("Peak");
+
+ act.CustomHeartRateZones.Count().Should().Be(0); //Empty CustomHeart Rate Zones
+
+ act.Value.Should().Be(55.44); //Value
+
+ }
+
+ private void ValidateHeartRateTimeSeriesData(HeartActivitiesTimeSeries activities)
+ {
+ var act = activities.HeartActivities;
+
+ act.Count().Should().Be(7);
+
+ var firstAct = act[0];
+ firstAct.DateTime.Should().Be(new DateTime(2017, 08, 15));
+
+ firstAct.CustomHeartRateZones.Count().Should().Be(0); //Empty Custom Heart Rate Zones
+
+ firstAct.HeartRateZones.Count().Should().Be(4); //Heart Rate Zones Count
+
+ firstAct.HeartRateZones[0].CaloriesOut.Should().Be(2257.6846); //First zone
+ firstAct.HeartRateZones[0].Max.Should().Be(92);
+ firstAct.HeartRateZones[0].Min.Should().Be(30);
+ firstAct.HeartRateZones[0].Minutes.Should().Be(1264);
+ firstAct.HeartRateZones[0].Name.Should().Be("Out of Range");
+
+ firstAct.HeartRateZones[3].CaloriesOut.Should().Be(287.33136); //Last zone
+ firstAct.HeartRateZones[3].Max.Should().Be(220);
+ firstAct.HeartRateZones[3].Min.Should().Be(156);
+ firstAct.HeartRateZones[3].Minutes.Should().Be(21);
+ firstAct.HeartRateZones[3].Name.Should().Be("Peak");
+
+ firstAct.RestingHeartRate.Should().Be(51);
+ }
+ }
+}
diff --git a/Fitbit.Portable.Tests/Interceptors/FitbitHttpErrorHandlerTests.cs b/Fitbit.Portable.Tests/Interceptors/FitbitHttpErrorHandlerTests.cs
index 23e1f906..83848405 100644
--- a/Fitbit.Portable.Tests/Interceptors/FitbitHttpErrorHandlerTests.cs
+++ b/Fitbit.Portable.Tests/Interceptors/FitbitHttpErrorHandlerTests.cs
@@ -10,8 +10,8 @@
using Fitbit.Api.Portable;
using Fitbit.Api.Portable.Interceptors;
using NUnit.Framework;
-using Ploeh.AutoFixture;
-using Ploeh.AutoFixture.Kernel;
+using AutoFixture;
+using AutoFixture.Kernel;
namespace Fitbit.Portable.Tests.Interceptors
{
diff --git a/Fitbit.Portable.Tests/Properties/AssemblyInfo.cs b/Fitbit.Portable.Tests/Properties/AssemblyInfo.cs
index 6d50a70f..1640be11 100644
--- a/Fitbit.Portable.Tests/Properties/AssemblyInfo.cs
+++ b/Fitbit.Portable.Tests/Properties/AssemblyInfo.cs
@@ -2,35 +2,3 @@
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
-// General Information about an assembly is controlled through the following
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-[assembly: AssemblyTitle("Fitbit.Portable.Tests")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("Fitbit.Portable.Tests")]
-[assembly: AssemblyCopyright("Copyright © 2014")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
-
-// Setting ComVisible to false makes the types in this assembly not visible
-// to COM components. If you need to access a type in this assembly from
-// COM, set the ComVisible attribute to true on that type.
-[assembly: ComVisible(false)]
-
-// The following GUID is for the ID of the typelib if this project is exposed to COM
-[assembly: Guid("5e8362e1-a55d-474f-8248-c92485709a0c")]
-
-// Version information for an assembly consists of the following four values:
-//
-// Major Version
-// Minor Version
-// Build Number
-// Revision
-//
-// You can specify all the values or you can default the Build and Revision Numbers
-// by using the '*' as shown below:
-// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.0.0.0")]
-[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/Fitbit.Portable.Tests/SampleData/GetActivityLogsList.json b/Fitbit.Portable.Tests/SampleData/GetActivityLogsList.json
new file mode 100644
index 00000000..eb896410
--- /dev/null
+++ b/Fitbit.Portable.Tests/SampleData/GetActivityLogsList.json
@@ -0,0 +1,1451 @@
+{
+ "activities": [
+ {
+ "activeDuration": 2764000,
+ "activityLevel": [
+ {
+ "minutes": 0,
+ "name": "sedentary"
+ },
+ {
+ "minutes": 1,
+ "name": "lightly"
+ },
+ {
+ "minutes": 1,
+ "name": "fairly"
+ },
+ {
+ "minutes": 44,
+ "name": "very"
+ }
+ ],
+ "activityName": "Walk",
+ "activityTypeId": 90013,
+ "averageHeartRate": 108,
+ "calories": 375,
+ "caloriesLink": "https://api.fitbit.com/1/user/-/activities/calories/date/2017-01-01/2017-01-01/1min/time/4:14/5:00.json",
+ "duration": 2764000,
+ "elevationGain": 3.048,
+ "heartRateLink": "https://api.fitbit.com/1/user/-/activities/heart/date/2017-01-01/2017-01-01/1sec/time/04:14:06/05:00:10.json",
+ "heartRateZones": [
+ {
+ "max": 95,
+ "min": 30,
+ "minutes": 3,
+ "name": "Out of Range"
+ },
+ {
+ "max": 133,
+ "min": 95,
+ "minutes": 43,
+ "name": "Fat Burn"
+ },
+ {
+ "max": 162,
+ "min": 133,
+ "minutes": 0,
+ "name": "Cardio"
+ },
+ {
+ "max": 220,
+ "min": 162,
+ "minutes": 0,
+ "name": "Peak"
+ }
+ ],
+ "lastModified": "2017-01-01T05:03:50.000Z",
+ "logId": 5390522508,
+ "logType": "auto_detected",
+ "manualValuesSpecified": {
+ "calories": false,
+ "distance": false,
+ "steps": false
+ },
+ "originalDuration": 2764000,
+ "originalStartTime": "2017-01-01T04:14:06.000Z",
+ "startTime": "2017-01-01T04:14:06.000Z",
+ "steps": 5138,
+ "tcxLink": "https://api.fitbit.com/1/user/-/activities/5390522508.tcx"
+ },
+ {
+ "activeDuration": 1938000,
+ "activityLevel": [
+ {
+ "minutes": 1,
+ "name": "sedentary"
+ },
+ {
+ "minutes": 2,
+ "name": "lightly"
+ },
+ {
+ "minutes": 5,
+ "name": "fairly"
+ },
+ {
+ "minutes": 24,
+ "name": "very"
+ }
+ ],
+ "activityName": "Spinning",
+ "activityTypeId": 55001,
+ "averageHeartRate": 139,
+ "calories": 330,
+ "caloriesLink": "https://api.fitbit.com/1/user/-/activities/calories/date/2017-01-02/2017-01-02/1min/time/8:42/9:14.json",
+ "duration": 1938000,
+ "elevationGain": 3.048,
+ "heartRateLink": "https://api.fitbit.com/1/user/-/activities/heart/date/2017-01-02/2017-01-02/1sec/time/08:42:26/09:14:44.json",
+ "heartRateZones": [
+ {
+ "max": 95,
+ "min": 30,
+ "minutes": 0,
+ "name": "Out of Range"
+ },
+ {
+ "max": 133,
+ "min": 95,
+ "minutes": 11,
+ "name": "Fat Burn"
+ },
+ {
+ "max": 162,
+ "min": 133,
+ "minutes": 17,
+ "name": "Cardio"
+ },
+ {
+ "max": 220,
+ "min": 162,
+ "minutes": 4,
+ "name": "Peak"
+ }
+ ],
+ "lastModified": "2017-01-02T09:24:18.000Z",
+ "logId": 5397828686,
+ "logType": "tracker",
+ "manualValuesSpecified": {
+ "calories": false,
+ "distance": false,
+ "steps": false
+ },
+ "originalDuration": 1938000,
+ "originalStartTime": "2017-01-02T08:42:26.000Z",
+ "source": {
+ "id": "82473273",
+ "name": "Charge 2",
+ "type": "tracker",
+ "url": "https://www.fitbit.com/"
+ },
+ "startTime": "2017-01-02T08:42:26.000Z",
+ "steps": 42,
+ "tcxLink": "https://api.fitbit.com/1/user/-/activities/5397828686.tcx"
+ },
+ {
+ "activeDuration": 1920000,
+ "activityLevel": [
+ {
+ "minutes": 0,
+ "name": "sedentary"
+ },
+ {
+ "minutes": 0,
+ "name": "lightly"
+ },
+ {
+ "minutes": 0,
+ "name": "fairly"
+ },
+ {
+ "minutes": 32,
+ "name": "very"
+ }
+ ],
+ "activityName": "Spinning",
+ "activityTypeId": 55001,
+ "averageHeartRate": 96,
+ "calories": 330,
+ "caloriesLink": "https://api.fitbit.com/1/user/-/activities/calories/date/2017-01-03/2017-01-03/1min/time/7:46/8:18.json",
+ "duration": 1920000,
+ "heartRateLink": "https://api.fitbit.com/1/user/-/activities/heart/date/2017-01-03/2017-01-03/1sec/time/07:46:00/08:18:00.json",
+ "heartRateZones": [
+ {
+ "max": 95,
+ "min": 30,
+ "minutes": 15,
+ "name": "Out of Range"
+ },
+ {
+ "max": 133,
+ "min": 95,
+ "minutes": 16,
+ "name": "Fat Burn"
+ },
+ {
+ "max": 162,
+ "min": 133,
+ "minutes": 1,
+ "name": "Cardio"
+ },
+ {
+ "max": 220,
+ "min": 162,
+ "minutes": 0,
+ "name": "Peak"
+ }
+ ],
+ "lastModified": "2017-01-03T08:32:19.000Z",
+ "logId": 5411224742,
+ "logType": "manual",
+ "manualValuesSpecified": {
+ "calories": true,
+ "distance": true,
+ "steps": true
+ },
+ "originalDuration": 1920000,
+ "originalStartTime": "2017-01-03T07:46:00.000Z",
+ "source": {
+ "id": "228TSL",
+ "name": "Fitbit for iPhone",
+ "type": "app",
+ "url": "https://www.fitbit.com/iphone"
+ },
+ "startTime": "2017-01-03T07:46:00.000Z",
+ "steps": 43,
+ "tcxLink": "https://api.fitbit.com/1/user/-/activities/5411224742.tcx"
+ },
+ {
+ "activeDuration": 2541000,
+ "activityLevel": [
+ {
+ "minutes": 0,
+ "name": "sedentary"
+ },
+ {
+ "minutes": 1,
+ "name": "lightly"
+ },
+ {
+ "minutes": 5,
+ "name": "fairly"
+ },
+ {
+ "minutes": 37,
+ "name": "very"
+ }
+ ],
+ "activityName": "Walk",
+ "activityTypeId": 90013,
+ "averageHeartRate": 87,
+ "calories": 349,
+ "caloriesLink": "https://api.fitbit.com/1/user/-/activities/calories/date/2017-01-05/2017-01-05/1min/time/8:16/8:59.json",
+ "detailsLink": "https://api.fitbit.com/1/user/-/activities/5442151842.json",
+ "distance": 3.386578,
+ "distanceUnit": "Kilometer",
+ "duration": 2541000,
+ "elevationGain": 3.048,
+ "heartRateLink": "https://api.fitbit.com/1/user/-/activities/heart/date/2017-01-05/2017-01-05/1sec/time/08:16:52/08:59:13.json",
+ "heartRateZones": [
+ {
+ "max": 95,
+ "min": 30,
+ "minutes": 34,
+ "name": "Out of Range"
+ },
+ {
+ "max": 133,
+ "min": 95,
+ "minutes": 8,
+ "name": "Fat Burn"
+ },
+ {
+ "max": 162,
+ "min": 133,
+ "minutes": 0,
+ "name": "Cardio"
+ },
+ {
+ "max": 220,
+ "min": 162,
+ "minutes": 0,
+ "name": "Peak"
+ }
+ ],
+ "lastModified": "2017-01-05T08:59:23.000Z",
+ "logId": 5442151842,
+ "logType": "mobile_run",
+ "manualValuesSpecified": {
+ "calories": false,
+ "distance": false,
+ "steps": false
+ },
+ "originalDuration": 2541000,
+ "originalStartTime": "2017-01-05T08:16:52.000Z",
+ "pace": 750.3149196622667,
+ "source": {
+ "id": "228TSL",
+ "name": "Fitbit for iPhone",
+ "type": "app",
+ "url": "https://www.fitbit.com/iphone"
+ },
+ "speed": 4.797985360094451,
+ "startTime": "2017-01-05T08:16:52.000Z",
+ "steps": 4798,
+ "tcxLink": "https://api.fitbit.com/1/user/-/activities/5442151842.tcx"
+ },
+ {
+ "activeDuration": 4403000,
+ "activityLevel": [
+ {
+ "minutes": 1,
+ "name": "sedentary"
+ },
+ {
+ "minutes": 8,
+ "name": "lightly"
+ },
+ {
+ "minutes": 12,
+ "name": "fairly"
+ },
+ {
+ "minutes": 52,
+ "name": "very"
+ }
+ ],
+ "activityName": "Bike",
+ "activityTypeId": 90001,
+ "averageHeartRate": 91,
+ "calories": 591,
+ "caloriesLink": "https://api.fitbit.com/1/user/-/activities/calories/date/2017-01-05/2017-01-05/1min/time/17:54/19:07.json",
+ "duration": 4403000,
+ "elevationGain": 329.184,
+ "heartRateLink": "https://api.fitbit.com/1/user/-/activities/heart/date/2017-01-05/2017-01-05/1sec/time/17:54:13/19:07:36.json",
+ "heartRateZones": [
+ {
+ "max": 95,
+ "min": 30,
+ "minutes": 51,
+ "name": "Out of Range"
+ },
+ {
+ "max": 133,
+ "min": 95,
+ "minutes": 17,
+ "name": "Fat Burn"
+ },
+ {
+ "max": 162,
+ "min": 133,
+ "minutes": 3,
+ "name": "Cardio"
+ },
+ {
+ "max": 220,
+ "min": 162,
+ "minutes": 0,
+ "name": "Peak"
+ }
+ ],
+ "lastModified": "2017-01-10T16:23:14.000Z",
+ "logId": 5449195844,
+ "logType": "auto_detected",
+ "manualValuesSpecified": {
+ "calories": false,
+ "distance": false,
+ "steps": false
+ },
+ "originalDuration": 4403000,
+ "originalStartTime": "2017-01-05T17:54:13.000Z",
+ "startTime": "2017-01-05T17:54:13.000Z",
+ "tcxLink": "https://api.fitbit.com/1/user/-/activities/5449195844.tcx"
+ },
+ {
+ "activeDuration": 666000,
+ "activityLevel": [
+ {
+ "minutes": 0,
+ "name": "sedentary"
+ },
+ {
+ "minutes": 3,
+ "name": "lightly"
+ },
+ {
+ "minutes": 7,
+ "name": "fairly"
+ },
+ {
+ "minutes": 1,
+ "name": "very"
+ }
+ ],
+ "activityName": "Bike",
+ "activityTypeId": 90001,
+ "averageHeartRate": 89,
+ "calories": 65,
+ "caloriesLink": "https://api.fitbit.com/1/user/-/activities/calories/date/2017-01-05/2017-01-05/1min/time/20:23/20:34.json",
+ "duration": 666000,
+ "elevationGain": 9.144,
+ "heartRateLink": "https://api.fitbit.com/1/user/-/activities/heart/date/2017-01-05/2017-01-05/1sec/time/20:23:32/20:34:38.json",
+ "heartRateZones": [
+ {
+ "max": 95,
+ "min": 30,
+ "minutes": 9,
+ "name": "Out of Range"
+ },
+ {
+ "max": 133,
+ "min": 95,
+ "minutes": 2,
+ "name": "Fat Burn"
+ },
+ {
+ "max": 162,
+ "min": 133,
+ "minutes": 0,
+ "name": "Cardio"
+ },
+ {
+ "max": 220,
+ "min": 162,
+ "minutes": 0,
+ "name": "Peak"
+ }
+ ],
+ "lastModified": "2017-01-10T16:23:26.000Z",
+ "logId": 5450925199,
+ "logType": "auto_detected",
+ "manualValuesSpecified": {
+ "calories": false,
+ "distance": false,
+ "steps": false
+ },
+ "originalDuration": 666000,
+ "originalStartTime": "2017-01-05T20:23:32.000Z",
+ "startTime": "2017-01-05T20:23:32.000Z",
+ "tcxLink": "https://api.fitbit.com/1/user/-/activities/5450925199.tcx"
+ },
+ {
+ "activeDuration": 12697000,
+ "activityLevel": [
+ {
+ "minutes": 6,
+ "name": "sedentary"
+ },
+ {
+ "minutes": 17,
+ "name": "lightly"
+ },
+ {
+ "minutes": 33,
+ "name": "fairly"
+ },
+ {
+ "minutes": 155,
+ "name": "very"
+ }
+ ],
+ "activityName": "Bike",
+ "activityTypeId": 90001,
+ "averageHeartRate": 116,
+ "calories": 1963,
+ "caloriesLink": "https://api.fitbit.com/1/user/-/activities/calories/date/2017-01-07/2017-01-07/1min/time/6:51/10:22.json",
+ "duration": 12697000,
+ "elevationGain": 749.808,
+ "heartRateLink": "https://api.fitbit.com/1/user/-/activities/heart/date/2017-01-07/2017-01-07/1sec/time/06:51:12/10:22:49.json",
+ "heartRateZones": [
+ {
+ "max": 95,
+ "min": 30,
+ "minutes": 31,
+ "name": "Out of Range"
+ },
+ {
+ "max": 133,
+ "min": 95,
+ "minutes": 104,
+ "name": "Fat Burn"
+ },
+ {
+ "max": 162,
+ "min": 133,
+ "minutes": 50,
+ "name": "Cardio"
+ },
+ {
+ "max": 220,
+ "min": 162,
+ "minutes": 6,
+ "name": "Peak"
+ }
+ ],
+ "lastModified": "2017-01-10T16:23:32.000Z",
+ "logId": 5471148749,
+ "logType": "auto_detected",
+ "manualValuesSpecified": {
+ "calories": false,
+ "distance": false,
+ "steps": false
+ },
+ "originalDuration": 12697000,
+ "originalStartTime": "2017-01-07T06:51:12.000Z",
+ "startTime": "2017-01-07T06:51:12.000Z",
+ "tcxLink": "https://api.fitbit.com/1/user/-/activities/5471148749.tcx"
+ },
+ {
+ "activeDuration": 4402000,
+ "activityLevel": [
+ {
+ "minutes": 0,
+ "name": "sedentary"
+ },
+ {
+ "minutes": 3,
+ "name": "lightly"
+ },
+ {
+ "minutes": 11,
+ "name": "fairly"
+ },
+ {
+ "minutes": 59,
+ "name": "very"
+ }
+ ],
+ "activityName": "Bike",
+ "activityTypeId": 90001,
+ "averageHeartRate": 116,
+ "calories": 683,
+ "caloriesLink": "https://api.fitbit.com/1/user/-/activities/calories/date/2017-01-07/2017-01-07/1min/time/11:04/12:18.json",
+ "duration": 4402000,
+ "elevationGain": 243.84,
+ "heartRateLink": "https://api.fitbit.com/1/user/-/activities/heart/date/2017-01-07/2017-01-07/1sec/time/11:04:38/12:18:00.json",
+ "heartRateZones": [
+ {
+ "max": 95,
+ "min": 30,
+ "minutes": 8,
+ "name": "Out of Range"
+ },
+ {
+ "max": 133,
+ "min": 95,
+ "minutes": 42,
+ "name": "Fat Burn"
+ },
+ {
+ "max": 162,
+ "min": 133,
+ "minutes": 15,
+ "name": "Cardio"
+ },
+ {
+ "max": 220,
+ "min": 162,
+ "minutes": 3,
+ "name": "Peak"
+ }
+ ],
+ "lastModified": "2017-01-10T16:23:38.000Z",
+ "logId": 5471704390,
+ "logType": "auto_detected",
+ "manualValuesSpecified": {
+ "calories": false,
+ "distance": false,
+ "steps": false
+ },
+ "originalDuration": 4402000,
+ "originalStartTime": "2017-01-07T11:04:38.000Z",
+ "startTime": "2017-01-07T11:04:38.000Z",
+ "tcxLink": "https://api.fitbit.com/1/user/-/activities/5471704390.tcx"
+ },
+ {
+ "activeDuration": 1994000,
+ "activityLevel": [
+ {
+ "minutes": 6,
+ "name": "sedentary"
+ },
+ {
+ "minutes": 2,
+ "name": "lightly"
+ },
+ {
+ "minutes": 3,
+ "name": "fairly"
+ },
+ {
+ "minutes": 22,
+ "name": "very"
+ }
+ ],
+ "activityName": "Spinning",
+ "activityTypeId": 55001,
+ "averageHeartRate": 128,
+ "calories": 296,
+ "caloriesLink": "https://api.fitbit.com/1/user/-/activities/calories/date/2017-01-09/2017-01-09/1min/time/6:39/7:12.json",
+ "duration": 1994000,
+ "elevationGain": 5.791,
+ "heartRateLink": "https://api.fitbit.com/1/user/-/activities/heart/date/2017-01-09/2017-01-09/1sec/time/06:39:04/07:12:18.json",
+ "heartRateZones": [
+ {
+ "max": 95,
+ "min": 30,
+ "minutes": 5,
+ "name": "Out of Range"
+ },
+ {
+ "max": 133,
+ "min": 95,
+ "minutes": 8,
+ "name": "Fat Burn"
+ },
+ {
+ "max": 162,
+ "min": 133,
+ "minutes": 17,
+ "name": "Cardio"
+ },
+ {
+ "max": 220,
+ "min": 162,
+ "minutes": 2,
+ "name": "Peak"
+ }
+ ],
+ "lastModified": "2017-01-09T07:17:55.000Z",
+ "logId": 5492615686,
+ "logType": "tracker",
+ "manualValuesSpecified": {
+ "calories": false,
+ "distance": false,
+ "steps": false
+ },
+ "originalDuration": 1994000,
+ "originalStartTime": "2017-01-09T06:39:04.000Z",
+ "source": {
+ "id": "82473273",
+ "name": "Charge 2",
+ "type": "tracker",
+ "url": "https://www.fitbit.com/"
+ },
+ "startTime": "2017-01-09T06:39:04.000Z",
+ "steps": 8,
+ "tcxLink": "https://api.fitbit.com/1/user/-/activities/5492615686.tcx"
+ },
+ {
+ "activeDuration": 2100000,
+ "activityLevel": [
+ {
+ "minutes": 0,
+ "name": "sedentary"
+ },
+ {
+ "minutes": 0,
+ "name": "lightly"
+ },
+ {
+ "minutes": 0,
+ "name": "fairly"
+ },
+ {
+ "minutes": 35,
+ "name": "very"
+ }
+ ],
+ "activityName": "Spinning",
+ "activityTypeId": 55001,
+ "averageHeartRate": 99,
+ "calories": 275,
+ "caloriesLink": "https://api.fitbit.com/1/user/-/activities/calories/date/2017-01-10/2017-01-10/1min/time/6:35/7:10.json",
+ "duration": 2100000,
+ "heartRateLink": "https://api.fitbit.com/1/user/-/activities/heart/date/2017-01-10/2017-01-10/1sec/time/06:35:00/07:10:00.json",
+ "heartRateZones": [
+ {
+ "max": 95,
+ "min": 30,
+ "minutes": 14,
+ "name": "Out of Range"
+ },
+ {
+ "max": 133,
+ "min": 95,
+ "minutes": 14,
+ "name": "Fat Burn"
+ },
+ {
+ "max": 162,
+ "min": 133,
+ "minutes": 3,
+ "name": "Cardio"
+ },
+ {
+ "max": 220,
+ "min": 162,
+ "minutes": 0,
+ "name": "Peak"
+ }
+ ],
+ "lastModified": "2017-01-10T16:24:20.000Z",
+ "logId": 5510209898,
+ "logType": "manual",
+ "manualValuesSpecified": {
+ "calories": false,
+ "distance": true,
+ "steps": true
+ },
+ "originalDuration": 2100000,
+ "originalStartTime": "2017-01-10T06:35:00.000Z",
+ "source": {
+ "id": "228TSL",
+ "name": "Fitbit for iPhone",
+ "type": "app",
+ "url": "https://www.fitbit.com/iphone"
+ },
+ "startTime": "2017-01-10T06:35:00.000Z",
+ "steps": 75,
+ "tcxLink": "https://api.fitbit.com/1/user/-/activities/5510209898.tcx"
+ },
+ {
+ "activeDuration": 1000,
+ "activityLevel": [
+ {
+ "minutes": 0,
+ "name": "sedentary"
+ },
+ {
+ "minutes": 0,
+ "name": "lightly"
+ },
+ {
+ "minutes": 0,
+ "name": "fairly"
+ },
+ {
+ "minutes": 0,
+ "name": "very"
+ }
+ ],
+ "activityName": "Run",
+ "activityTypeId": 90009,
+ "averageHeartRate": 59,
+ "calories": 0,
+ "caloriesLink": "https://api.fitbit.com/1/user/-/activities/calories/date/2017-01-10/2017-01-10/1min/time/20:52/20:52.json",
+ "detailsLink": "https://api.fitbit.com/1/user/-/activities/5515193190.json",
+ "distance": 0,
+ "distanceUnit": "Kilometer",
+ "duration": 1000,
+ "elevationGain": 0,
+ "heartRateLink": "https://api.fitbit.com/1/user/-/activities/heart/date/2017-01-10/2017-01-10/1sec/time/20:52:27/20:52:28.json",
+ "heartRateZones": [
+ {
+ "max": 95,
+ "min": 30,
+ "minutes": 0,
+ "name": "Out of Range"
+ },
+ {
+ "max": 133,
+ "min": 95,
+ "minutes": 0,
+ "name": "Fat Burn"
+ },
+ {
+ "max": 162,
+ "min": 133,
+ "minutes": 0,
+ "name": "Cardio"
+ },
+ {
+ "max": 220,
+ "min": 162,
+ "minutes": 0,
+ "name": "Peak"
+ }
+ ],
+ "lastModified": "2017-01-10T21:05:18.000Z",
+ "logId": 5515193190,
+ "logType": "tracker",
+ "manualValuesSpecified": {
+ "calories": false,
+ "distance": false,
+ "steps": false
+ },
+ "originalDuration": 1000,
+ "originalStartTime": "2017-01-10T20:52:27.000Z",
+ "source": {
+ "id": "82473273",
+ "name": "Charge 2",
+ "type": "tracker",
+ "url": "https://www.fitbit.com/"
+ },
+ "speed": 0,
+ "startTime": "2017-01-10T20:52:27.000Z",
+ "steps": 0,
+ "tcxLink": "https://api.fitbit.com/1/user/-/activities/5515193190.tcx"
+ },
+ {
+ "activeDuration": 3341000,
+ "activityLevel": [
+ {
+ "minutes": 0,
+ "name": "sedentary"
+ },
+ {
+ "minutes": 1,
+ "name": "lightly"
+ },
+ {
+ "minutes": 1,
+ "name": "fairly"
+ },
+ {
+ "minutes": 53,
+ "name": "very"
+ }
+ ],
+ "activityName": "Spinning",
+ "activityTypeId": 55001,
+ "averageHeartRate": 153,
+ "calories": 676,
+ "caloriesLink": "https://api.fitbit.com/1/user/-/activities/calories/date/2017-01-12/2017-01-12/1min/time/6:34/7:30.json",
+ "duration": 3341000,
+ "elevationGain": 8.534,
+ "heartRateLink": "https://api.fitbit.com/1/user/-/activities/heart/date/2017-01-12/2017-01-12/1sec/time/06:34:42/07:30:23.json",
+ "heartRateZones": [
+ {
+ "max": 95,
+ "min": 30,
+ "minutes": 0,
+ "name": "Out of Range"
+ },
+ {
+ "max": 133,
+ "min": 95,
+ "minutes": 4,
+ "name": "Fat Burn"
+ },
+ {
+ "max": 162,
+ "min": 133,
+ "minutes": 39,
+ "name": "Cardio"
+ },
+ {
+ "max": 220,
+ "min": 162,
+ "minutes": 13,
+ "name": "Peak"
+ }
+ ],
+ "lastModified": "2017-01-12T07:31:29.000Z",
+ "logId": 5539312165,
+ "logType": "tracker",
+ "manualValuesSpecified": {
+ "calories": false,
+ "distance": false,
+ "steps": false
+ },
+ "originalDuration": 3341000,
+ "originalStartTime": "2017-01-12T06:34:42.000Z",
+ "source": {
+ "id": "82473273",
+ "name": "Charge 2",
+ "type": "tracker",
+ "url": "https://www.fitbit.com/"
+ },
+ "startTime": "2017-01-12T06:34:42.000Z",
+ "steps": 64,
+ "tcxLink": "https://api.fitbit.com/1/user/-/activities/5539312165.tcx"
+ },
+ {
+ "activeDuration": 1800000,
+ "activityLevel": [
+ {
+ "minutes": 0,
+ "name": "sedentary"
+ },
+ {
+ "minutes": 0,
+ "name": "lightly"
+ },
+ {
+ "minutes": 0,
+ "name": "fairly"
+ },
+ {
+ "minutes": 30,
+ "name": "very"
+ }
+ ],
+ "activityName": "Spinning",
+ "activityTypeId": 55001,
+ "averageHeartRate": 104,
+ "calories": 228,
+ "caloriesLink": "https://api.fitbit.com/1/user/-/activities/calories/date/2017-01-12/2017-01-12/1min/time/17:25/17:55.json",
+ "duration": 1800000,
+ "heartRateLink": "https://api.fitbit.com/1/user/-/activities/heart/date/2017-01-12/2017-01-12/1sec/time/17:25:00/17:55:00.json",
+ "heartRateZones": [
+ {
+ "max": 95,
+ "min": 30,
+ "minutes": 8,
+ "name": "Out of Range"
+ },
+ {
+ "max": 133,
+ "min": 95,
+ "minutes": 8,
+ "name": "Fat Burn"
+ },
+ {
+ "max": 162,
+ "min": 133,
+ "minutes": 4,
+ "name": "Cardio"
+ },
+ {
+ "max": 220,
+ "min": 162,
+ "minutes": 0,
+ "name": "Peak"
+ }
+ ],
+ "lastModified": "2017-01-12T18:08:58.000Z",
+ "logId": 5548314782,
+ "logType": "manual",
+ "manualValuesSpecified": {
+ "calories": false,
+ "distance": true,
+ "steps": true
+ },
+ "originalDuration": 1800000,
+ "originalStartTime": "2017-01-12T17:25:00.000Z",
+ "source": {
+ "id": "228TSL",
+ "name": "Fitbit for iPhone",
+ "type": "app",
+ "url": "https://www.fitbit.com/iphone"
+ },
+ "startTime": "2017-01-12T17:25:00.000Z",
+ "steps": 141,
+ "tcxLink": "https://api.fitbit.com/1/user/-/activities/5548314782.tcx"
+ },
+ {
+ "activeDuration": 768000,
+ "activityLevel": [
+ {
+ "minutes": 0,
+ "name": "sedentary"
+ },
+ {
+ "minutes": 12,
+ "name": "lightly"
+ },
+ {
+ "minutes": 0,
+ "name": "fairly"
+ },
+ {
+ "minutes": 0,
+ "name": "very"
+ }
+ ],
+ "activityName": "Walk",
+ "activityTypeId": 90013,
+ "averageHeartRate": 86,
+ "calories": 81,
+ "caloriesLink": "https://api.fitbit.com/1/user/-/activities/calories/date/2017-01-13/2017-01-13/1min/time/13:33/13:45.json",
+ "duration": 768000,
+ "elevationGain": 21.336,
+ "heartRateLink": "https://api.fitbit.com/1/user/-/activities/heart/date/2017-01-13/2017-01-13/1sec/time/13:33:11/13:45:59.json",
+ "heartRateZones": [
+ {
+ "max": 95,
+ "min": 30,
+ "minutes": 7,
+ "name": "Out of Range"
+ },
+ {
+ "max": 133,
+ "min": 95,
+ "minutes": 5,
+ "name": "Fat Burn"
+ },
+ {
+ "max": 162,
+ "min": 133,
+ "minutes": 0,
+ "name": "Cardio"
+ },
+ {
+ "max": 220,
+ "min": 162,
+ "minutes": 0,
+ "name": "Peak"
+ }
+ ],
+ "lastModified": "2017-01-13T14:23:41.000Z",
+ "logId": 5561886374,
+ "logType": "auto_detected",
+ "manualValuesSpecified": {
+ "calories": false,
+ "distance": false,
+ "steps": false
+ },
+ "originalDuration": 768000,
+ "originalStartTime": "2017-01-13T13:33:11.000Z",
+ "startTime": "2017-01-13T13:33:11.000Z",
+ "steps": 958,
+ "tcxLink": "https://api.fitbit.com/1/user/-/activities/5561886374.tcx"
+ },
+ {
+ "activeDuration": 10557000,
+ "activityLevel": [
+ {
+ "minutes": 0,
+ "name": "sedentary"
+ },
+ {
+ "minutes": 3,
+ "name": "lightly"
+ },
+ {
+ "minutes": 9,
+ "name": "fairly"
+ },
+ {
+ "minutes": 164,
+ "name": "very"
+ }
+ ],
+ "activityName": "Bike",
+ "activityTypeId": 90001,
+ "averageHeartRate": 150,
+ "calories": 2100,
+ "caloriesLink": "https://api.fitbit.com/1/user/-/activities/calories/date/2017-01-14/2017-01-14/1min/time/6:52/9:48.json",
+ "detailsLink": "https://api.fitbit.com/1/user/-/activities/5568699492.json",
+ "distance": 70.555069,
+ "distanceUnit": "Kilometer",
+ "duration": 10559000,
+ "elevationGain": 426.72,
+ "heartRateLink": "https://api.fitbit.com/1/user/-/activities/heart/date/2017-01-14/2017-01-14/1sec/time/06:52:25/09:48:24.json",
+ "heartRateZones": [
+ {
+ "max": 95,
+ "min": 30,
+ "minutes": 4,
+ "name": "Out of Range"
+ },
+ {
+ "max": 133,
+ "min": 95,
+ "minutes": 22,
+ "name": "Fat Burn"
+ },
+ {
+ "max": 162,
+ "min": 133,
+ "minutes": 94,
+ "name": "Cardio"
+ },
+ {
+ "max": 220,
+ "min": 162,
+ "minutes": 56,
+ "name": "Peak"
+ }
+ ],
+ "lastModified": "2017-01-14T09:48:39.000Z",
+ "logId": 5568699492,
+ "logType": "tracker",
+ "manualValuesSpecified": {
+ "calories": false,
+ "distance": false,
+ "steps": false
+ },
+ "originalDuration": 10559000,
+ "originalStartTime": "2017-01-14T06:52:25.000Z",
+ "source": {
+ "id": "82473273",
+ "name": "Charge 2",
+ "type": "tracker",
+ "url": "https://www.fitbit.com/"
+ },
+ "speed": 24.05969957374254,
+ "startTime": "2017-01-14T06:52:25.000Z",
+ "tcxLink": "https://api.fitbit.com/1/user/-/activities/5568699492.tcx"
+ },
+ {
+ "activeDuration": 3600000,
+ "activityLevel": [
+ {
+ "minutes": 0,
+ "name": "sedentary"
+ },
+ {
+ "minutes": 0,
+ "name": "lightly"
+ },
+ {
+ "minutes": 0,
+ "name": "fairly"
+ },
+ {
+ "minutes": 60,
+ "name": "very"
+ }
+ ],
+ "activityName": "Spinning",
+ "activityTypeId": 55001,
+ "averageHeartRate": 149,
+ "calories": 462,
+ "caloriesLink": "https://api.fitbit.com/1/user/-/activities/calories/date/2017-01-16/2017-01-16/1min/time/6:40/7:40.json",
+ "duration": 3600000,
+ "heartRateLink": "https://api.fitbit.com/1/user/-/activities/heart/date/2017-01-16/2017-01-16/1sec/time/06:40:00/07:40:00.json",
+ "heartRateZones": [
+ {
+ "max": 95,
+ "min": 30,
+ "minutes": 2,
+ "name": "Out of Range"
+ },
+ {
+ "max": 133,
+ "min": 95,
+ "minutes": 5,
+ "name": "Fat Burn"
+ },
+ {
+ "max": 162,
+ "min": 133,
+ "minutes": 30,
+ "name": "Cardio"
+ },
+ {
+ "max": 220,
+ "min": 162,
+ "minutes": 8,
+ "name": "Peak"
+ }
+ ],
+ "lastModified": "2017-01-16T08:17:16.000Z",
+ "logId": 5597625685,
+ "logType": "manual",
+ "manualValuesSpecified": {
+ "calories": false,
+ "distance": true,
+ "steps": true
+ },
+ "originalDuration": 3600000,
+ "originalStartTime": "2017-01-16T06:40:00.000Z",
+ "source": {
+ "id": "228TSL",
+ "name": "Fitbit for iPhone",
+ "type": "app",
+ "url": "https://www.fitbit.com/iphone"
+ },
+ "startTime": "2017-01-16T06:40:00.000Z",
+ "steps": 220,
+ "tcxLink": "https://api.fitbit.com/1/user/-/activities/5597625685.tcx"
+ },
+ {
+ "activeDuration": 3600000,
+ "activityLevel": [
+ {
+ "minutes": 0,
+ "name": "sedentary"
+ },
+ {
+ "minutes": 0,
+ "name": "lightly"
+ },
+ {
+ "minutes": 0,
+ "name": "fairly"
+ },
+ {
+ "minutes": 60,
+ "name": "very"
+ }
+ ],
+ "activityName": "Spinning",
+ "activityTypeId": 55001,
+ "averageHeartRate": 142,
+ "calories": 462,
+ "caloriesLink": "https://api.fitbit.com/1/user/-/activities/calories/date/2017-01-17/2017-01-17/1min/time/6:33/7:33.json",
+ "duration": 3600000,
+ "heartRateLink": "https://api.fitbit.com/1/user/-/activities/heart/date/2017-01-17/2017-01-17/1sec/time/06:33:00/07:33:00.json",
+ "heartRateZones": [
+ {
+ "max": 95,
+ "min": 30,
+ "minutes": 5,
+ "name": "Out of Range"
+ },
+ {
+ "max": 133,
+ "min": 95,
+ "minutes": 4,
+ "name": "Fat Burn"
+ },
+ {
+ "max": 162,
+ "min": 133,
+ "minutes": 39,
+ "name": "Cardio"
+ },
+ {
+ "max": 220,
+ "min": 162,
+ "minutes": 1,
+ "name": "Peak"
+ }
+ ],
+ "lastModified": "2017-01-17T07:34:26.000Z",
+ "logId": 5611002233,
+ "logType": "manual",
+ "manualValuesSpecified": {
+ "calories": false,
+ "distance": true,
+ "steps": true
+ },
+ "originalDuration": 3600000,
+ "originalStartTime": "2017-01-17T06:33:00.000Z",
+ "source": {
+ "id": "228TSL",
+ "name": "Fitbit for iPhone",
+ "type": "app",
+ "url": "https://www.fitbit.com/iphone"
+ },
+ "startTime": "2017-01-17T06:33:00.000Z",
+ "steps": 21,
+ "tcxLink": "https://api.fitbit.com/1/user/-/activities/5611002233.tcx"
+ },
+ {
+ "activeDuration": 2130000,
+ "activityLevel": [
+ {
+ "minutes": 0,
+ "name": "sedentary"
+ },
+ {
+ "minutes": 0,
+ "name": "lightly"
+ },
+ {
+ "minutes": 0,
+ "name": "fairly"
+ },
+ {
+ "minutes": 36,
+ "name": "very"
+ }
+ ],
+ "activityName": "Spinning",
+ "activityTypeId": 55001,
+ "averageHeartRate": 101,
+ "calories": 273,
+ "caloriesLink": "https://api.fitbit.com/1/user/-/activities/calories/date/2017-01-18/2017-01-18/1min/time/12:55/13:30.json",
+ "duration": 2130000,
+ "heartRateLink": "https://api.fitbit.com/1/user/-/activities/heart/date/2017-01-18/2017-01-18/1sec/time/12:55:00/13:30:30.json",
+ "heartRateZones": [
+ {
+ "max": 95,
+ "min": 30,
+ "minutes": 14,
+ "name": "Out of Range"
+ },
+ {
+ "max": 133,
+ "min": 95,
+ "minutes": 8,
+ "name": "Fat Burn"
+ },
+ {
+ "max": 162,
+ "min": 133,
+ "minutes": 6,
+ "name": "Cardio"
+ },
+ {
+ "max": 220,
+ "min": 162,
+ "minutes": 0,
+ "name": "Peak"
+ }
+ ],
+ "lastModified": "2017-01-18T16:14:10.000Z",
+ "logId": 5634769316,
+ "logType": "manual",
+ "manualValuesSpecified": {
+ "calories": false,
+ "distance": true,
+ "steps": true
+ },
+ "originalDuration": 2130000,
+ "originalStartTime": "2017-01-18T12:55:00.000Z",
+ "source": {
+ "id": "228TSL",
+ "name": "Fitbit for iPhone",
+ "type": "app",
+ "url": "https://www.fitbit.com/iphone"
+ },
+ "startTime": "2017-01-18T12:55:00.000Z",
+ "steps": 105,
+ "tcxLink": "https://api.fitbit.com/1/user/-/activities/5634769316.tcx"
+ },
+ {
+ "activeDuration": 4813000,
+ "activityLevel": [
+ {
+ "minutes": 1,
+ "name": "sedentary"
+ },
+ {
+ "minutes": 15,
+ "name": "lightly"
+ },
+ {
+ "minutes": 16,
+ "name": "fairly"
+ },
+ {
+ "minutes": 48,
+ "name": "very"
+ }
+ ],
+ "activityName": "Outdoor Bike",
+ "activityTypeId": 1071,
+ "averageHeartRate": 107,
+ "calories": 692,
+ "caloriesLink": "https://api.fitbit.com/1/user/-/activities/calories/date/2017-01-19/2017-01-19/1min/time/17:49/19:09.json",
+ "duration": 4813000,
+ "elevationGain": 283.464,
+ "heartRateLink": "https://api.fitbit.com/1/user/-/activities/heart/date/2017-01-19/2017-01-19/1sec/time/17:49:14/19:09:27.json",
+ "heartRateZones": [
+ {
+ "max": 95,
+ "min": 30,
+ "minutes": 16,
+ "name": "Out of Range"
+ },
+ {
+ "max": 133,
+ "min": 95,
+ "minutes": 38,
+ "name": "Fat Burn"
+ },
+ {
+ "max": 162,
+ "min": 133,
+ "minutes": 14,
+ "name": "Cardio"
+ },
+ {
+ "max": 220,
+ "min": 162,
+ "minutes": 1,
+ "name": "Peak"
+ }
+ ],
+ "lastModified": "2017-01-19T19:18:24.000Z",
+ "logId": 5657171581,
+ "logType": "auto_detected",
+ "manualValuesSpecified": {
+ "calories": false,
+ "distance": false,
+ "steps": false
+ },
+ "originalDuration": 4813000,
+ "originalStartTime": "2017-01-19T17:49:14.000Z",
+ "startTime": "2017-01-19T17:49:14.000Z",
+ "tcxLink": "https://api.fitbit.com/1/user/-/activities/5657171581.tcx"
+ },
+ {
+ "activeDuration": 8284000,
+ "activityLevel": [
+ {
+ "minutes": 30,
+ "name": "sedentary"
+ },
+ {
+ "minutes": 14,
+ "name": "lightly"
+ },
+ {
+ "minutes": 5,
+ "name": "fairly"
+ },
+ {
+ "minutes": 89,
+ "name": "very"
+ }
+ ],
+ "activityName": "Spinning",
+ "activityTypeId": 55001,
+ "averageHeartRate": 125,
+ "calories": 1143,
+ "caloriesLink": "https://api.fitbit.com/1/user/-/activities/calories/date/2017-01-21/2017-01-21/1min/time/8:27/10:45.json",
+ "duration": 8284000,
+ "elevationGain": 16.154,
+ "heartRateLink": "https://api.fitbit.com/1/user/-/activities/heart/date/2017-01-21/2017-01-21/1sec/time/08:27:06/10:45:10.json",
+ "heartRateZones": [
+ {
+ "max": 95,
+ "min": 30,
+ "minutes": 28,
+ "name": "Out of Range"
+ },
+ {
+ "max": 133,
+ "min": 95,
+ "minutes": 24,
+ "name": "Fat Burn"
+ },
+ {
+ "max": 162,
+ "min": 133,
+ "minutes": 84,
+ "name": "Cardio"
+ },
+ {
+ "max": 220,
+ "min": 162,
+ "minutes": 1,
+ "name": "Peak"
+ }
+ ],
+ "lastModified": "2017-01-21T10:48:50.000Z",
+ "logId": 5681232699,
+ "logType": "tracker",
+ "manualValuesSpecified": {
+ "calories": false,
+ "distance": false,
+ "steps": false
+ },
+ "originalDuration": 8284000,
+ "originalStartTime": "2017-01-21T08:27:06.000Z",
+ "source": {
+ "id": "82473273",
+ "name": "Charge 2",
+ "type": "tracker",
+ "url": "https://www.fitbit.com/"
+ },
+ "startTime": "2017-01-21T08:27:06.000Z",
+ "steps": 272,
+ "tcxLink": "https://api.fitbit.com/1/user/-/activities/5681232699.tcx"
+ }
+ ],
+ "pagination": {
+ "afterDate": "2017-01-01T00:00:00",
+ "limit": 20,
+ "next": "https://api.fitbit.com/1/user/-/activities/list.json?offset=20&limit=20&sort=asc&afterDate=2017-01-01T00%3A00%3A00",
+ "offset": 0,
+ "previous": "",
+ "sort": "asc"
+ }
+}
\ No newline at end of file
diff --git a/Fitbit.Portable.Tests/SampleData/GetActivityLogsList2.json b/Fitbit.Portable.Tests/SampleData/GetActivityLogsList2.json
new file mode 100644
index 00000000..274946d2
--- /dev/null
+++ b/Fitbit.Portable.Tests/SampleData/GetActivityLogsList2.json
@@ -0,0 +1,1582 @@
+{
+ "activities": [
+
+ {
+ "activeDuration": 1126000,
+ "activityLevel": [
+
+ {
+ "minutes": 1,
+ "name": "sedentary"
+ },
+
+ {
+ "minutes": 0,
+ "name": "lightly"
+ },
+
+ {
+ "minutes": 2,
+ "name": "fairly"
+ },
+
+ {
+ "minutes": 15,
+ "name": "very"
+ }
+ ],
+ "activityName": "Walk",
+ "activityTypeId": 90013,
+ "averageHeartRate": 94,
+ "calories": 150,
+ "caloriesLink": "https://api.fitbit.com/1/user/-/activities/calories/date/2017-09-01/2017-09-01/1min/time/8:16/8:35.json",
+ "duration": 1126000,
+ "elevationGain": 6.096,
+ "heartRateLink": "https://api.fitbit.com/1/user/-/activities/heart/date/2017-09-01/2017-09-01/1sec/time/08:16:14/08:35:00.json",
+ "heartRateZones": [
+
+ {
+ "max": 92,
+ "min": 30,
+ "minutes": 3,
+ "name": "Out of Range"
+ },
+
+ {
+ "max": 128,
+ "min": 92,
+ "minutes": 6,
+ "name": "Fat Burn"
+ },
+
+ {
+ "max": 156,
+ "min": 128,
+ "minutes": 2,
+ "name": "Cardio"
+ },
+
+ {
+ "max": 220,
+ "min": 156,
+ "minutes": 1,
+ "name": "Peak"
+ }
+ ],
+ "lastModified": "2017-09-01T17:44:07.000Z",
+ "logId": 9672992546,
+ "logType": "auto_detected",
+ "manualValuesSpecified": {
+ "calories": false,
+ "distance": false,
+ "steps": false
+ },
+ "originalDuration": 1126000,
+ "originalStartTime": "2017-09-01T08:16:14.000-07:00",
+ "startTime": "2017-09-01T08:16:14.000-07:00",
+ "steps": 1758,
+ "tcxLink": "https://api.fitbit.com/1/user/-/activities/9672992546.tcx"
+ },
+
+ {
+ "activeDuration": 1834000,
+ "activityLevel": [
+
+ {
+ "minutes": 0,
+ "name": "sedentary"
+ },
+
+ {
+ "minutes": 0,
+ "name": "lightly"
+ },
+
+ {
+ "minutes": 0,
+ "name": "fairly"
+ },
+
+ {
+ "minutes": 32,
+ "name": "very"
+ }
+ ],
+ "activityName": "Run",
+ "activityTypeId": 90009,
+ "averageHeartRate": 129,
+ "calories": 355,
+ "caloriesLink": "https://api.fitbit.com/1/user/-/activities/calories/date/2017-09-01/2017-09-01/1min/time/18:54/19:29.json",
+ "distance": 5.502559,
+ "distanceUnit": "Kilometer",
+ "duration": 2103000,
+ "elevationGain": 54.864,
+ "heartRateLink": "https://api.fitbit.com/1/user/-/activities/heart/date/2017-09-01/2017-09-01/1sec/time/18:54:51/19:29:54.json",
+ "heartRateZones": [
+
+ {
+ "max": 92,
+ "min": 30,
+ "minutes": 1,
+ "name": "Out of Range"
+ },
+
+ {
+ "max": 128,
+ "min": 92,
+ "minutes": 8,
+ "name": "Fat Burn"
+ },
+
+ {
+ "max": 156,
+ "min": 128,
+ "minutes": 22,
+ "name": "Cardio"
+ },
+
+ {
+ "max": 220,
+ "min": 156,
+ "minutes": 0,
+ "name": "Peak"
+ }
+ ],
+ "lastModified": "2017-09-02T02:31:34.000Z",
+ "logId": 9675733775,
+ "logType": "tracker",
+ "manualValuesSpecified": {
+ "calories": false,
+ "distance": false,
+ "steps": false
+ },
+ "originalDuration": 2103000,
+ "originalStartTime": "2017-09-01T18:54:51.000-07:00",
+ "pace": 333.299470301,
+ "source": {
+ "id": "93686741",
+ "name": "Surge",
+ "type": "tracker",
+ "url": "https://www.fitbit.com/"
+ },
+ "speed": 10.801097273718646,
+ "startTime": "2017-09-01T18:54:51.000-07:00",
+ "steps": 5018,
+ "tcxLink": "https://api.fitbit.com/1/user/-/activities/9675733775.tcx"
+ },
+
+ {
+ "activeDuration": 2054000,
+ "activityLevel": [
+
+ {
+ "minutes": 0,
+ "name": "sedentary"
+ },
+
+ {
+ "minutes": 0,
+ "name": "lightly"
+ },
+
+ {
+ "minutes": 0,
+ "name": "fairly"
+ },
+
+ {
+ "minutes": 34,
+ "name": "very"
+ }
+ ],
+ "activityName": "Run",
+ "activityTypeId": 90009,
+ "averageHeartRate": 142,
+ "calories": 417,
+ "caloriesLink": "https://api.fitbit.com/1/user/-/activities/calories/date/2017-09-02/2017-09-02/1min/time/19:25/20:00.json",
+ "distance": 6.54444,
+ "distanceUnit": "Kilometer",
+ "duration": 2084000,
+ "elevationGain": 41.91,
+ "heartRateLink": "https://api.fitbit.com/1/user/-/activities/heart/date/2017-09-02/2017-09-02/1sec/time/19:25:24/20:00:08.json",
+ "heartRateZones": [
+
+ {
+ "max": 92,
+ "min": 30,
+ "minutes": 1,
+ "name": "Out of Range"
+ },
+
+ {
+ "max": 128,
+ "min": 92,
+ "minutes": 1,
+ "name": "Fat Burn"
+ },
+
+ {
+ "max": 156,
+ "min": 128,
+ "minutes": 27,
+ "name": "Cardio"
+ },
+
+ {
+ "max": 220,
+ "min": 156,
+ "minutes": 6,
+ "name": "Peak"
+ }
+ ],
+ "lastModified": "2017-09-03T03:03:04.000Z",
+ "logId": 9692690916,
+ "logType": "tracker",
+ "manualValuesSpecified": {
+ "calories": false,
+ "distance": false,
+ "steps": false
+ },
+ "originalDuration": 2084000,
+ "originalStartTime": "2017-09-02T19:25:24.000-07:00",
+ "pace": 313.8542029570139,
+ "source": {
+ "id": "93686741",
+ "name": "Surge",
+ "type": "tracker",
+ "url": "https://www.fitbit.com/"
+ },
+ "speed": 11.470294060370009,
+ "startTime": "2017-09-02T19:25:24.000-07:00",
+ "steps": 5651,
+ "tcxLink": "https://api.fitbit.com/1/user/-/activities/9692690916.tcx"
+ },
+
+ {
+ "activeDuration": 921000,
+ "activityLevel": [
+
+ {
+ "minutes": 0,
+ "name": "sedentary"
+ },
+
+ {
+ "minutes": 3,
+ "name": "lightly"
+ },
+
+ {
+ "minutes": 9,
+ "name": "fairly"
+ },
+
+ {
+ "minutes": 4,
+ "name": "very"
+ }
+ ],
+ "activityName": "Walk",
+ "activityTypeId": 90013,
+ "averageHeartRate": 84,
+ "calories": 95,
+ "caloriesLink": "https://api.fitbit.com/1/user/-/activities/calories/date/2017-09-03/2017-09-03/1min/time/19:34/19:50.json",
+ "duration": 921000,
+ "elevationGain": 0,
+ "heartRateLink": "https://api.fitbit.com/1/user/-/activities/heart/date/2017-09-03/2017-09-03/1sec/time/19:34:51/19:50:12.json",
+ "heartRateZones": [
+
+ {
+ "max": 92,
+ "min": 30,
+ "minutes": 11,
+ "name": "Out of Range"
+ },
+
+ {
+ "max": 128,
+ "min": 92,
+ "minutes": 5,
+ "name": "Fat Burn"
+ },
+
+ {
+ "max": 156,
+ "min": 128,
+ "minutes": 0,
+ "name": "Cardio"
+ },
+
+ {
+ "max": 220,
+ "min": 156,
+ "minutes": 0,
+ "name": "Peak"
+ }
+ ],
+ "lastModified": "2017-09-04T04:54:51.000Z",
+ "logId": 9712603607,
+ "logType": "auto_detected",
+ "manualValuesSpecified": {
+ "calories": false,
+ "distance": false,
+ "steps": false
+ },
+ "originalDuration": 921000,
+ "originalStartTime": "2017-09-03T19:34:51.000-07:00",
+ "startTime": "2017-09-03T19:34:51.000-07:00",
+ "steps": 1150,
+ "tcxLink": "https://api.fitbit.com/1/user/-/activities/9712603607.tcx"
+ },
+
+ {
+ "activeDuration": 1203000,
+ "activityLevel": [
+
+ {
+ "minutes": 0,
+ "name": "sedentary"
+ },
+
+ {
+ "minutes": 0,
+ "name": "lightly"
+ },
+
+ {
+ "minutes": 0,
+ "name": "fairly"
+ },
+
+ {
+ "minutes": 20,
+ "name": "very"
+ }
+ ],
+ "activityName": "Run",
+ "activityTypeId": 90009,
+ "averageHeartRate": 162,
+ "calories": 289,
+ "caloriesLink": "https://api.fitbit.com/1/user/-/activities/calories/date/2017-09-03/2017-09-03/1min/time/20:00/20:21.json",
+ "distance": 5.12796,
+ "distanceUnit": "Kilometer",
+ "duration": 1271000,
+ "elevationGain": 15.24,
+ "heartRateLink": "https://api.fitbit.com/1/user/-/activities/heart/date/2017-09-03/2017-09-03/1sec/time/20:00:03/20:21:14.json",
+ "heartRateZones": [
+
+ {
+ "max": 92,
+ "min": 30,
+ "minutes": 0,
+ "name": "Out of Range"
+ },
+
+ {
+ "max": 128,
+ "min": 92,
+ "minutes": 1,
+ "name": "Fat Burn"
+ },
+
+ {
+ "max": 156,
+ "min": 128,
+ "minutes": 1,
+ "name": "Cardio"
+ },
+
+ {
+ "max": 220,
+ "min": 156,
+ "minutes": 19,
+ "name": "Peak"
+ }
+ ],
+ "lastModified": "2017-09-04T04:54:46.000Z",
+ "logId": 9711437124,
+ "logType": "tracker",
+ "manualValuesSpecified": {
+ "calories": false,
+ "distance": false,
+ "steps": false
+ },
+ "originalDuration": 1271000,
+ "originalStartTime": "2017-09-03T20:00:03.000-07:00",
+ "pace": 234.5962136990148,
+ "source": {
+ "id": "93686741",
+ "name": "Surge",
+ "type": "tracker",
+ "url": "https://www.fitbit.com/"
+ },
+ "speed": 15.345516209476308,
+ "startTime": "2017-09-03T20:00:03.000-07:00",
+ "steps": 3496,
+ "tcxLink": "https://api.fitbit.com/1/user/-/activities/9711437124.tcx"
+ },
+
+ {
+ "activeDuration": 1280000,
+ "activityLevel": [
+
+ {
+ "minutes": 1,
+ "name": "sedentary"
+ },
+
+ {
+ "minutes": 2,
+ "name": "lightly"
+ },
+
+ {
+ "minutes": 6,
+ "name": "fairly"
+ },
+
+ {
+ "minutes": 12,
+ "name": "very"
+ }
+ ],
+ "activityName": "Walk",
+ "activityTypeId": 90013,
+ "averageHeartRate": 85,
+ "calories": 143,
+ "caloriesLink": "https://api.fitbit.com/1/user/-/activities/calories/date/2017-09-04/2017-09-04/1min/time/10:34/10:56.json",
+ "duration": 1280000,
+ "elevationGain": 15.24,
+ "heartRateLink": "https://api.fitbit.com/1/user/-/activities/heart/date/2017-09-04/2017-09-04/1sec/time/10:34:56/10:56:16.json",
+ "heartRateZones": [
+
+ {
+ "max": 92,
+ "min": 30,
+ "minutes": 16,
+ "name": "Out of Range"
+ },
+
+ {
+ "max": 128,
+ "min": 92,
+ "minutes": 3,
+ "name": "Fat Burn"
+ },
+
+ {
+ "max": 156,
+ "min": 128,
+ "minutes": 0,
+ "name": "Cardio"
+ },
+
+ {
+ "max": 220,
+ "min": 156,
+ "minutes": 0,
+ "name": "Peak"
+ }
+ ],
+ "lastModified": "2017-09-04T18:10:32.000Z",
+ "logId": 9720996316,
+ "logType": "auto_detected",
+ "manualValuesSpecified": {
+ "calories": false,
+ "distance": false,
+ "steps": false
+ },
+ "originalDuration": 1280000,
+ "originalStartTime": "2017-09-04T10:34:56.000-07:00",
+ "startTime": "2017-09-04T10:34:56.000-07:00",
+ "steps": 1904,
+ "tcxLink": "https://api.fitbit.com/1/user/-/activities/9720996316.tcx"
+ },
+
+ {
+ "activeDuration": 2048000,
+ "activityLevel": [
+
+ {
+ "minutes": 1,
+ "name": "sedentary"
+ },
+
+ {
+ "minutes": 1,
+ "name": "lightly"
+ },
+
+ {
+ "minutes": 11,
+ "name": "fairly"
+ },
+
+ {
+ "minutes": 21,
+ "name": "very"
+ }
+ ],
+ "activityName": "Walk",
+ "activityTypeId": 90013,
+ "averageHeartRate": 88,
+ "calories": 236,
+ "caloriesLink": "https://api.fitbit.com/1/user/-/activities/calories/date/2017-09-04/2017-09-04/1min/time/19:24/19:59.json",
+ "duration": 2048000,
+ "elevationGain": 30.48,
+ "heartRateLink": "https://api.fitbit.com/1/user/-/activities/heart/date/2017-09-04/2017-09-04/1sec/time/19:24:52/19:59:00.json",
+ "heartRateZones": [
+
+ {
+ "max": 92,
+ "min": 30,
+ "minutes": 18,
+ "name": "Out of Range"
+ },
+
+ {
+ "max": 128,
+ "min": 92,
+ "minutes": 16,
+ "name": "Fat Burn"
+ },
+
+ {
+ "max": 156,
+ "min": 128,
+ "minutes": 0,
+ "name": "Cardio"
+ },
+
+ {
+ "max": 220,
+ "min": 156,
+ "minutes": 0,
+ "name": "Peak"
+ }
+ ],
+ "lastModified": "2017-09-05T21:41:11.000Z",
+ "logId": 9743358154,
+ "logType": "auto_detected",
+ "manualValuesSpecified": {
+ "calories": false,
+ "distance": false,
+ "steps": false
+ },
+ "originalDuration": 2048000,
+ "originalStartTime": "2017-09-04T19:24:52.000-07:00",
+ "startTime": "2017-09-04T19:24:52.000-07:00",
+ "steps": 3301,
+ "tcxLink": "https://api.fitbit.com/1/user/-/activities/9743358154.tcx"
+ },
+
+ {
+ "activeDuration": 1229000,
+ "activityLevel": [
+
+ {
+ "minutes": 0,
+ "name": "sedentary"
+ },
+
+ {
+ "minutes": 1,
+ "name": "lightly"
+ },
+
+ {
+ "minutes": 2,
+ "name": "fairly"
+ },
+
+ {
+ "minutes": 17,
+ "name": "very"
+ }
+ ],
+ "activityName": "Walk",
+ "activityTypeId": 90013,
+ "averageHeartRate": 87,
+ "calories": 145,
+ "caloriesLink": "https://api.fitbit.com/1/user/-/activities/calories/date/2017-09-05/2017-09-05/1min/time/9:10/9:31.json",
+ "duration": 1229000,
+ "elevationGain": 9.144,
+ "heartRateLink": "https://api.fitbit.com/1/user/-/activities/heart/date/2017-09-05/2017-09-05/1sec/time/09:10:53/09:31:22.json",
+ "heartRateZones": [
+
+ {
+ "max": 92,
+ "min": 30,
+ "minutes": 17,
+ "name": "Out of Range"
+ },
+
+ {
+ "max": 128,
+ "min": 92,
+ "minutes": 4,
+ "name": "Fat Burn"
+ },
+
+ {
+ "max": 156,
+ "min": 128,
+ "minutes": 0,
+ "name": "Cardio"
+ },
+
+ {
+ "max": 220,
+ "min": 156,
+ "minutes": 0,
+ "name": "Peak"
+ }
+ ],
+ "lastModified": "2017-09-05T21:41:11.000Z",
+ "logId": 9743358155,
+ "logType": "auto_detected",
+ "manualValuesSpecified": {
+ "calories": false,
+ "distance": false,
+ "steps": false
+ },
+ "originalDuration": 1229000,
+ "originalStartTime": "2017-09-05T09:10:53.000-07:00",
+ "startTime": "2017-09-05T09:10:53.000-07:00",
+ "steps": 2132,
+ "tcxLink": "https://api.fitbit.com/1/user/-/activities/9743358155.tcx"
+ },
+
+ {
+ "activeDuration": 1023000,
+ "activityLevel": [
+
+ {
+ "minutes": 0,
+ "name": "sedentary"
+ },
+
+ {
+ "minutes": 0,
+ "name": "lightly"
+ },
+
+ {
+ "minutes": 1,
+ "name": "fairly"
+ },
+
+ {
+ "minutes": 16,
+ "name": "very"
+ }
+ ],
+ "activityName": "Walk",
+ "activityTypeId": 90013,
+ "averageHeartRate": 139,
+ "calories": 174,
+ "caloriesLink": "https://api.fitbit.com/1/user/-/activities/calories/date/2017-09-05/2017-09-05/1min/time/21:35/21:52.json",
+ "duration": 1023000,
+ "elevationGain": 3.048,
+ "heartRateLink": "https://api.fitbit.com/1/user/-/activities/heart/date/2017-09-05/2017-09-05/1sec/time/21:35:52/21:52:55.json",
+ "heartRateZones": [
+
+ {
+ "max": 92,
+ "min": 30,
+ "minutes": 0,
+ "name": "Out of Range"
+ },
+
+ {
+ "max": 128,
+ "min": 92,
+ "minutes": 2,
+ "name": "Fat Burn"
+ },
+
+ {
+ "max": 156,
+ "min": 128,
+ "minutes": 2,
+ "name": "Cardio"
+ },
+
+ {
+ "max": 220,
+ "min": 156,
+ "minutes": 7,
+ "name": "Peak"
+ }
+ ],
+ "lastModified": "2017-09-06T04:57:31.000Z",
+ "logId": 9748240773,
+ "logType": "auto_detected",
+ "manualValuesSpecified": {
+ "calories": false,
+ "distance": false,
+ "steps": false
+ },
+ "originalDuration": 1023000,
+ "originalStartTime": "2017-09-05T21:35:52.000-07:00",
+ "startTime": "2017-09-05T21:35:52.000-07:00",
+ "steps": 1738,
+ "tcxLink": "https://api.fitbit.com/1/user/-/activities/9748240773.tcx"
+ },
+
+ {
+ "activeDuration": 1382000,
+ "activityLevel": [
+
+ {
+ "minutes": 0,
+ "name": "sedentary"
+ },
+
+ {
+ "minutes": 3,
+ "name": "lightly"
+ },
+
+ {
+ "minutes": 2,
+ "name": "fairly"
+ },
+
+ {
+ "minutes": 19,
+ "name": "very"
+ }
+ ],
+ "activityName": "Walk",
+ "activityTypeId": 90013,
+ "averageHeartRate": 117,
+ "calories": 215,
+ "caloriesLink": "https://api.fitbit.com/1/user/-/activities/calories/date/2017-09-06/2017-09-06/1min/time/20:39/21:03.json",
+ "duration": 1382000,
+ "elevationGain": 21.336,
+ "heartRateLink": "https://api.fitbit.com/1/user/-/activities/heart/date/2017-09-06/2017-09-06/1sec/time/20:39:59/21:03:01.json",
+ "heartRateZones": [
+
+ {
+ "max": 92,
+ "min": 30,
+ "minutes": 3,
+ "name": "Out of Range"
+ },
+
+ {
+ "max": 128,
+ "min": 92,
+ "minutes": 4,
+ "name": "Fat Burn"
+ },
+
+ {
+ "max": 156,
+ "min": 128,
+ "minutes": 4,
+ "name": "Cardio"
+ },
+
+ {
+ "max": 220,
+ "min": 156,
+ "minutes": 4,
+ "name": "Peak"
+ }
+ ],
+ "lastModified": "2017-09-07T04:06:21.000Z",
+ "logId": 9766322317,
+ "logType": "auto_detected",
+ "manualValuesSpecified": {
+ "calories": false,
+ "distance": false,
+ "steps": false
+ },
+ "originalDuration": 1382000,
+ "originalStartTime": "2017-09-06T20:39:59.000-07:00",
+ "startTime": "2017-09-06T20:39:59.000-07:00",
+ "steps": 2432,
+ "tcxLink": "https://api.fitbit.com/1/user/-/activities/9766322317.tcx"
+ },
+
+ {
+ "activeDuration": 920000,
+ "activityLevel": [
+
+ {
+ "minutes": 1,
+ "name": "sedentary"
+ },
+
+ {
+ "minutes": 14,
+ "name": "lightly"
+ },
+
+ {
+ "minutes": 0,
+ "name": "fairly"
+ },
+
+ {
+ "minutes": 0,
+ "name": "very"
+ }
+ ],
+ "activityName": "Walk",
+ "activityTypeId": 90013,
+ "averageHeartRate": 89,
+ "calories": 91,
+ "caloriesLink": "https://api.fitbit.com/1/user/-/activities/calories/date/2017-09-07/2017-09-07/1min/time/16:07/16:22.json",
+ "duration": 920000,
+ "elevationGain": 21.336,
+ "heartRateLink": "https://api.fitbit.com/1/user/-/activities/heart/date/2017-09-07/2017-09-07/1sec/time/16:07:21/16:22:41.json",
+ "heartRateZones": [
+
+ {
+ "max": 92,
+ "min": 30,
+ "minutes": 9,
+ "name": "Out of Range"
+ },
+
+ {
+ "max": 128,
+ "min": 92,
+ "minutes": 6,
+ "name": "Fat Burn"
+ },
+
+ {
+ "max": 156,
+ "min": 128,
+ "minutes": 0,
+ "name": "Cardio"
+ },
+
+ {
+ "max": 220,
+ "min": 156,
+ "minutes": 0,
+ "name": "Peak"
+ }
+ ],
+ "lastModified": "2017-09-07T23:32:46.000Z",
+ "logId": 9782094419,
+ "logType": "auto_detected",
+ "manualValuesSpecified": {
+ "calories": false,
+ "distance": false,
+ "steps": false
+ },
+ "originalDuration": 920000,
+ "originalStartTime": "2017-09-07T16:07:21.000-07:00",
+ "startTime": "2017-09-07T16:07:21.000-07:00",
+ "steps": 1069,
+ "tcxLink": "https://api.fitbit.com/1/user/-/activities/9782094419.tcx"
+ },
+
+ {
+ "activeDuration": 1126000,
+ "activityLevel": [
+
+ {
+ "minutes": 0,
+ "name": "sedentary"
+ },
+
+ {
+ "minutes": 1,
+ "name": "lightly"
+ },
+
+ {
+ "minutes": 1,
+ "name": "fairly"
+ },
+
+ {
+ "minutes": 17,
+ "name": "very"
+ }
+ ],
+ "activityName": "Walk",
+ "activityTypeId": 90013,
+ "averageHeartRate": 105,
+ "calories": 159,
+ "caloriesLink": "https://api.fitbit.com/1/user/-/activities/calories/date/2017-09-08/2017-09-08/1min/time/12:40/12:59.json",
+ "duration": 1126000,
+ "elevationGain": 6.096,
+ "heartRateLink": "https://api.fitbit.com/1/user/-/activities/heart/date/2017-09-08/2017-09-08/1sec/time/12:40:26/12:59:12.json",
+ "heartRateZones": [
+
+ {
+ "max": 92,
+ "min": 30,
+ "minutes": 4,
+ "name": "Out of Range"
+ },
+
+ {
+ "max": 128,
+ "min": 92,
+ "minutes": 9,
+ "name": "Fat Burn"
+ },
+
+ {
+ "max": 156,
+ "min": 128,
+ "minutes": 2,
+ "name": "Cardio"
+ },
+
+ {
+ "max": 220,
+ "min": 156,
+ "minutes": 0,
+ "name": "Peak"
+ }
+ ],
+ "lastModified": "2017-09-08T20:07:18.000Z",
+ "logId": 9795510989,
+ "logType": "auto_detected",
+ "manualValuesSpecified": {
+ "calories": false,
+ "distance": false,
+ "steps": false
+ },
+ "originalDuration": 1126000,
+ "originalStartTime": "2017-09-08T12:40:26.000-07:00",
+ "startTime": "2017-09-08T12:40:26.000-07:00",
+ "steps": 2005,
+ "tcxLink": "https://api.fitbit.com/1/user/-/activities/9795510989.tcx"
+ },
+
+ {
+ "activeDuration": 1383000,
+ "activityLevel": [
+
+ {
+ "minutes": 4,
+ "name": "sedentary"
+ },
+
+ {
+ "minutes": 6,
+ "name": "lightly"
+ },
+
+ {
+ "minutes": 1,
+ "name": "fairly"
+ },
+
+ {
+ "minutes": 12,
+ "name": "very"
+ }
+ ],
+ "activityName": "Walk",
+ "activityTypeId": 90013,
+ "averageHeartRate": 89,
+ "calories": 156,
+ "caloriesLink": "https://api.fitbit.com/1/user/-/activities/calories/date/2017-09-09/2017-09-09/1min/time/19:19/19:42.json",
+ "duration": 1383000,
+ "elevationGain": 30.48,
+ "heartRateLink": "https://api.fitbit.com/1/user/-/activities/heart/date/2017-09-09/2017-09-09/1sec/time/19:19:20/19:42:23.json",
+ "heartRateZones": [
+
+ {
+ "max": 92,
+ "min": 30,
+ "minutes": 8,
+ "name": "Out of Range"
+ },
+
+ {
+ "max": 128,
+ "min": 92,
+ "minutes": 12,
+ "name": "Fat Burn"
+ },
+
+ {
+ "max": 156,
+ "min": 128,
+ "minutes": 0,
+ "name": "Cardio"
+ },
+
+ {
+ "max": 220,
+ "min": 156,
+ "minutes": 0,
+ "name": "Peak"
+ }
+ ],
+ "lastModified": "2017-09-10T05:23:53.000Z",
+ "logId": 9816956883,
+ "logType": "auto_detected",
+ "manualValuesSpecified": {
+ "calories": false,
+ "distance": false,
+ "steps": false
+ },
+ "originalDuration": 1383000,
+ "originalStartTime": "2017-09-09T19:19:20.000-07:00",
+ "startTime": "2017-09-09T19:19:20.000-07:00",
+ "steps": 1621,
+ "tcxLink": "https://api.fitbit.com/1/user/-/activities/9816956883.tcx"
+ },
+
+ {
+ "activeDuration": 1435000,
+ "activityLevel": [
+
+ {
+ "minutes": 1,
+ "name": "sedentary"
+ },
+
+ {
+ "minutes": 6,
+ "name": "lightly"
+ },
+
+ {
+ "minutes": 9,
+ "name": "fairly"
+ },
+
+ {
+ "minutes": 7,
+ "name": "very"
+ }
+ ],
+ "activityName": "Walk",
+ "activityTypeId": 90013,
+ "averageHeartRate": 80,
+ "calories": 137,
+ "caloriesLink": "https://api.fitbit.com/1/user/-/activities/calories/date/2017-09-09/2017-09-09/1min/time/22:49/23:13.json",
+ "duration": 1435000,
+ "elevationGain": 3.048,
+ "heartRateLink": "https://api.fitbit.com/1/user/-/activities/heart/date/2017-09-09/2017-09-09/1sec/time/22:49:17/23:13:12.json",
+ "heartRateZones": [
+
+ {
+ "max": 92,
+ "min": 30,
+ "minutes": 13,
+ "name": "Out of Range"
+ },
+
+ {
+ "max": 128,
+ "min": 92,
+ "minutes": 6,
+ "name": "Fat Burn"
+ },
+
+ {
+ "max": 156,
+ "min": 128,
+ "minutes": 0,
+ "name": "Cardio"
+ },
+
+ {
+ "max": 220,
+ "min": 156,
+ "minutes": 0,
+ "name": "Peak"
+ }
+ ],
+ "lastModified": "2017-09-10T07:35:02.000Z",
+ "logId": 9817624169,
+ "logType": "auto_detected",
+ "manualValuesSpecified": {
+ "calories": false,
+ "distance": false,
+ "steps": false
+ },
+ "originalDuration": 1435000,
+ "originalStartTime": "2017-09-09T22:49:17.000-07:00",
+ "startTime": "2017-09-09T22:49:17.000-07:00",
+ "steps": 1784,
+ "tcxLink": "https://api.fitbit.com/1/user/-/activities/9817624169.tcx"
+ },
+
+ {
+ "activeDuration": 1535000,
+ "activityLevel": [
+
+ {
+ "minutes": 4,
+ "name": "sedentary"
+ },
+
+ {
+ "minutes": 11,
+ "name": "lightly"
+ },
+
+ {
+ "minutes": 1,
+ "name": "fairly"
+ },
+
+ {
+ "minutes": 9,
+ "name": "very"
+ }
+ ],
+ "activityName": "Walk",
+ "activityTypeId": 90013,
+ "averageHeartRate": 83,
+ "calories": 153,
+ "caloriesLink": "https://api.fitbit.com/1/user/-/activities/calories/date/2017-09-10/2017-09-10/1min/time/10:26/10:52.json",
+ "duration": 1535000,
+ "elevationGain": 12.192,
+ "heartRateLink": "https://api.fitbit.com/1/user/-/activities/heart/date/2017-09-10/2017-09-10/1sec/time/10:26:29/10:52:04.json",
+ "heartRateZones": [
+
+ {
+ "max": 92,
+ "min": 30,
+ "minutes": 15,
+ "name": "Out of Range"
+ },
+
+ {
+ "max": 128,
+ "min": 92,
+ "minutes": 9,
+ "name": "Fat Burn"
+ },
+
+ {
+ "max": 156,
+ "min": 128,
+ "minutes": 0,
+ "name": "Cardio"
+ },
+
+ {
+ "max": 220,
+ "min": 156,
+ "minutes": 0,
+ "name": "Peak"
+ }
+ ],
+ "lastModified": "2017-09-10T17:58:08.000Z",
+ "logId": 9824250863,
+ "logType": "auto_detected",
+ "manualValuesSpecified": {
+ "calories": false,
+ "distance": false,
+ "steps": false
+ },
+ "originalDuration": 1535000,
+ "originalStartTime": "2017-09-10T10:26:29.000-07:00",
+ "startTime": "2017-09-10T10:26:29.000-07:00",
+ "steps": 1987,
+ "tcxLink": "https://api.fitbit.com/1/user/-/activities/9824250863.tcx"
+ },
+
+ {
+ "activeDuration": 1126000,
+ "activityLevel": [
+
+ {
+ "minutes": 1,
+ "name": "sedentary"
+ },
+
+ {
+ "minutes": 2,
+ "name": "lightly"
+ },
+
+ {
+ "minutes": 4,
+ "name": "fairly"
+ },
+
+ {
+ "minutes": 11,
+ "name": "very"
+ }
+ ],
+ "activityName": "Walk",
+ "activityTypeId": 90013,
+ "averageHeartRate": 81,
+ "calories": 120,
+ "caloriesLink": "https://api.fitbit.com/1/user/-/activities/calories/date/2017-09-11/2017-09-11/1min/time/7:29/7:48.json",
+ "duration": 1126000,
+ "elevationGain": 15.24,
+ "heartRateLink": "https://api.fitbit.com/1/user/-/activities/heart/date/2017-09-11/2017-09-11/1sec/time/07:29:25/07:48:11.json",
+ "heartRateZones": [
+
+ {
+ "max": 92,
+ "min": 30,
+ "minutes": 17,
+ "name": "Out of Range"
+ },
+
+ {
+ "max": 128,
+ "min": 92,
+ "minutes": 2,
+ "name": "Fat Burn"
+ },
+
+ {
+ "max": 156,
+ "min": 128,
+ "minutes": 0,
+ "name": "Cardio"
+ },
+
+ {
+ "max": 220,
+ "min": 156,
+ "minutes": 0,
+ "name": "Peak"
+ }
+ ],
+ "lastModified": "2017-09-11T14:51:57.000Z",
+ "logId": 9837494906,
+ "logType": "auto_detected",
+ "manualValuesSpecified": {
+ "calories": false,
+ "distance": false,
+ "steps": false
+ },
+ "originalDuration": 1126000,
+ "originalStartTime": "2017-09-11T07:29:25.000-07:00",
+ "startTime": "2017-09-11T07:29:25.000-07:00",
+ "steps": 1715,
+ "tcxLink": "https://api.fitbit.com/1/user/-/activities/9837494906.tcx"
+ },
+
+ {
+ "activeDuration": 1178000,
+ "activityLevel": [
+
+ {
+ "minutes": 0,
+ "name": "sedentary"
+ },
+
+ {
+ "minutes": 1,
+ "name": "lightly"
+ },
+
+ {
+ "minutes": 4,
+ "name": "fairly"
+ },
+
+ {
+ "minutes": 14,
+ "name": "very"
+ }
+ ],
+ "activityName": "Walk",
+ "activityTypeId": 90013,
+ "averageHeartRate": 91,
+ "calories": 143,
+ "caloriesLink": "https://api.fitbit.com/1/user/-/activities/calories/date/2017-09-13/2017-09-13/1min/time/8:48/9:08.json",
+ "duration": 1178000,
+ "elevationGain": 18.288,
+ "heartRateLink": "https://api.fitbit.com/1/user/-/activities/heart/date/2017-09-13/2017-09-13/1sec/time/08:48:47/09:08:25.json",
+ "heartRateZones": [
+
+ {
+ "max": 92,
+ "min": 30,
+ "minutes": 9,
+ "name": "Out of Range"
+ },
+
+ {
+ "max": 128,
+ "min": 92,
+ "minutes": 8,
+ "name": "Fat Burn"
+ },
+
+ {
+ "max": 156,
+ "min": 128,
+ "minutes": 0,
+ "name": "Cardio"
+ },
+
+ {
+ "max": 220,
+ "min": 156,
+ "minutes": 0,
+ "name": "Peak"
+ }
+ ],
+ "lastModified": "2017-09-14T14:38:53.000Z",
+ "logId": 9894765643,
+ "logType": "auto_detected",
+ "manualValuesSpecified": {
+ "calories": false,
+ "distance": false,
+ "steps": false
+ },
+ "originalDuration": 1178000,
+ "originalStartTime": "2017-09-13T08:48:47.000-07:00",
+ "startTime": "2017-09-13T08:48:47.000-07:00",
+ "steps": 1856,
+ "tcxLink": "https://api.fitbit.com/1/user/-/activities/9894765643.tcx"
+ },
+
+ {
+ "activeDuration": 1127000,
+ "activityLevel": [
+
+ {
+ "minutes": 2,
+ "name": "sedentary"
+ },
+
+ {
+ "minutes": 2,
+ "name": "lightly"
+ },
+
+ {
+ "minutes": 2,
+ "name": "fairly"
+ },
+
+ {
+ "minutes": 12,
+ "name": "very"
+ }
+ ],
+ "activityName": "Walk",
+ "activityTypeId": 90013,
+ "averageHeartRate": 87,
+ "calories": 122,
+ "caloriesLink": "https://api.fitbit.com/1/user/-/activities/calories/date/2017-09-14/2017-09-14/1min/time/7:52/8:10.json",
+ "duration": 1127000,
+ "elevationGain": 18.288,
+ "heartRateLink": "https://api.fitbit.com/1/user/-/activities/heart/date/2017-09-14/2017-09-14/1sec/time/07:52:03/08:10:50.json",
+ "heartRateZones": [
+
+ {
+ "max": 92,
+ "min": 30,
+ "minutes": 13,
+ "name": "Out of Range"
+ },
+
+ {
+ "max": 128,
+ "min": 92,
+ "minutes": 5,
+ "name": "Fat Burn"
+ },
+
+ {
+ "max": 156,
+ "min": 128,
+ "minutes": 0,
+ "name": "Cardio"
+ },
+
+ {
+ "max": 220,
+ "min": 156,
+ "minutes": 0,
+ "name": "Peak"
+ }
+ ],
+ "lastModified": "2017-09-14T15:21:41.000Z",
+ "logId": 9895302005,
+ "logType": "auto_detected",
+ "manualValuesSpecified": {
+ "calories": false,
+ "distance": false,
+ "steps": false
+ },
+ "originalDuration": 1127000,
+ "originalStartTime": "2017-09-14T07:52:03.000-07:00",
+ "startTime": "2017-09-14T07:52:03.000-07:00",
+ "steps": 1597,
+ "tcxLink": "https://api.fitbit.com/1/user/-/activities/9895302005.tcx"
+ },
+
+ {
+ "activeDuration": 973000,
+ "activityLevel": [
+
+ {
+ "minutes": 1,
+ "name": "sedentary"
+ },
+
+ {
+ "minutes": 0,
+ "name": "lightly"
+ },
+
+ {
+ "minutes": 4,
+ "name": "fairly"
+ },
+
+ {
+ "minutes": 11,
+ "name": "very"
+ }
+ ],
+ "activityName": "Walk",
+ "activityTypeId": 90013,
+ "averageHeartRate": 85,
+ "calories": 128,
+ "caloriesLink": "https://api.fitbit.com/1/user/-/activities/calories/date/2017-09-14/2017-09-14/1min/time/14:51/15:07.json",
+ "duration": 973000,
+ "elevationGain": 13.004,
+ "heartRateLink": "https://api.fitbit.com/1/user/-/activities/heart/date/2017-09-14/2017-09-14/1sec/time/14:51:03/15:07:16.json",
+ "heartRateZones": [
+
+ {
+ "max": 92,
+ "min": 30,
+ "minutes": 9,
+ "name": "Out of Range"
+ },
+
+ {
+ "max": 128,
+ "min": 92,
+ "minutes": 2,
+ "name": "Fat Burn"
+ },
+
+ {
+ "max": 156,
+ "min": 128,
+ "minutes": 0,
+ "name": "Cardio"
+ },
+
+ {
+ "max": 220,
+ "min": 156,
+ "minutes": 1,
+ "name": "Peak"
+ }
+ ],
+ "lastModified": "2017-09-14T22:19:56.000Z",
+ "logId": 9903511341,
+ "logType": "auto_detected",
+ "manualValuesSpecified": {
+ "calories": false,
+ "distance": false,
+ "steps": false
+ },
+ "originalDuration": 973000,
+ "originalStartTime": "2017-09-14T14:51:03.000-07:00",
+ "startTime": "2017-09-14T14:51:03.000-07:00",
+ "steps": 1440,
+ "tcxLink": "https://api.fitbit.com/1/user/-/activities/9903511341.tcx"
+ },
+
+ {
+ "activeDuration": 1740000,
+ "activityLevel": [
+
+ {
+ "minutes": 1,
+ "name": "sedentary"
+ },
+
+ {
+ "minutes": 2,
+ "name": "lightly"
+ },
+
+ {
+ "minutes": 9,
+ "name": "fairly"
+ },
+
+ {
+ "minutes": 17,
+ "name": "very"
+ }
+ ],
+ "activityName": "Walk",
+ "activityTypeId": 90013,
+ "averageHeartRate": 84,
+ "calories": 203,
+ "caloriesLink": "https://api.fitbit.com/1/user/-/activities/calories/date/2017-09-15/2017-09-15/1min/time/8:05/8:34.json",
+ "duration": 1740000,
+ "elevationGain": 21.336,
+ "heartRateLink": "https://api.fitbit.com/1/user/-/activities/heart/date/2017-09-15/2017-09-15/1sec/time/08:05:18/08:34:18.json",
+ "heartRateZones": [
+
+ {
+ "max": 92,
+ "min": 30,
+ "minutes": 21,
+ "name": "Out of Range"
+ },
+
+ {
+ "max": 128,
+ "min": 92,
+ "minutes": 8,
+ "name": "Fat Burn"
+ },
+
+ {
+ "max": 156,
+ "min": 128,
+ "minutes": 0,
+ "name": "Cardio"
+ },
+
+ {
+ "max": 220,
+ "min": 156,
+ "minutes": 0,
+ "name": "Peak"
+ }
+ ],
+ "lastModified": "2017-09-15T15:47:02.000Z",
+ "logId": 9914385428,
+ "logType": "auto_detected",
+ "manualValuesSpecified": {
+ "calories": false,
+ "distance": false,
+ "steps": false
+ },
+ "originalDuration": 1740000,
+ "originalStartTime": "2017-09-15T08:05:18.000-07:00",
+ "startTime": "2017-09-15T08:05:18.000-07:00",
+ "steps": 2788,
+ "tcxLink": "https://api.fitbit.com/1/user/-/activities/9914385428.tcx"
+ }
+ ],
+ "pagination": {
+ "afterDate": "2017-09-01",
+ "limit": 20,
+ "next": "https://api.fitbit.com/1/user/-/activities/list.json?offset=20&limit=20&sort=asc&afterDate=2017-09-01",
+ "offset": 0,
+ "previous": "",
+ "sort": "asc"
+ }
+}
\ No newline at end of file
diff --git a/Fitbit.Portable.Tests/SampleData/GetHeartRateIntradayTimeSeries.json b/Fitbit.Portable.Tests/SampleData/GetHeartRateIntradayTimeSeries.json
new file mode 100644
index 00000000..40af65cf
--- /dev/null
+++ b/Fitbit.Portable.Tests/SampleData/GetHeartRateIntradayTimeSeries.json
@@ -0,0 +1,4675 @@
+{
+ "activities-heart": [
+ {
+ "dateTime": "2017-06-29",
+ "value": {
+ "customHeartRateZones": [],
+ "heartRateZones": [
+ {
+ "caloriesOut": 1693.83222,
+ "max": 95,
+ "min": 30,
+ "minutes": 1122,
+ "name": "Out of Range"
+ },
+ {
+ "caloriesOut": 211.22723,
+ "max": 133,
+ "min": 95,
+ "minutes": 35,
+ "name": "Fat Burn"
+ },
+ {
+ "caloriesOut": 0,
+ "max": 162,
+ "min": 133,
+ "minutes": 0,
+ "name": "Cardio"
+ },
+ {
+ "caloriesOut": 0,
+ "max": 220,
+ "min": 162,
+ "minutes": 0,
+ "name": "Peak"
+ }
+ ],
+ "restingHeartRate": 59
+ }
+ }
+ ],
+ "activities-heart-intraday": {
+ "dataset": [
+ {
+ "time": "00:00:00",
+ "value": 58
+ },
+ {
+ "time": "00:01:00",
+ "value": 58
+ },
+ {
+ "time": "00:02:00",
+ "value": 56
+ },
+ {
+ "time": "00:03:00",
+ "value": 55
+ },
+ {
+ "time": "00:04:00",
+ "value": 56
+ },
+ {
+ "time": "00:05:00",
+ "value": 54
+ },
+ {
+ "time": "00:06:00",
+ "value": 55
+ },
+ {
+ "time": "00:07:00",
+ "value": 54
+ },
+ {
+ "time": "00:08:00",
+ "value": 55
+ },
+ {
+ "time": "00:09:00",
+ "value": 55
+ },
+ {
+ "time": "00:10:00",
+ "value": 58
+ },
+ {
+ "time": "00:11:00",
+ "value": 56
+ },
+ {
+ "time": "00:12:00",
+ "value": 57
+ },
+ {
+ "time": "00:13:00",
+ "value": 57
+ },
+ {
+ "time": "00:14:00",
+ "value": 56
+ },
+ {
+ "time": "00:15:00",
+ "value": 55
+ },
+ {
+ "time": "00:16:00",
+ "value": 56
+ },
+ {
+ "time": "00:17:00",
+ "value": 57
+ },
+ {
+ "time": "00:18:00",
+ "value": 56
+ },
+ {
+ "time": "00:19:00",
+ "value": 58
+ },
+ {
+ "time": "00:20:00",
+ "value": 58
+ },
+ {
+ "time": "00:21:00",
+ "value": 58
+ },
+ {
+ "time": "00:22:00",
+ "value": 58
+ },
+ {
+ "time": "00:23:00",
+ "value": 58
+ },
+ {
+ "time": "00:24:00",
+ "value": 58
+ },
+ {
+ "time": "00:25:00",
+ "value": 58
+ },
+ {
+ "time": "00:26:00",
+ "value": 60
+ },
+ {
+ "time": "00:27:00",
+ "value": 58
+ },
+ {
+ "time": "00:28:00",
+ "value": 58
+ },
+ {
+ "time": "00:29:00",
+ "value": 62
+ },
+ {
+ "time": "00:30:00",
+ "value": 59
+ },
+ {
+ "time": "00:31:00",
+ "value": 59
+ },
+ {
+ "time": "00:32:00",
+ "value": 59
+ },
+ {
+ "time": "00:33:00",
+ "value": 60
+ },
+ {
+ "time": "00:34:00",
+ "value": 59
+ },
+ {
+ "time": "00:35:00",
+ "value": 60
+ },
+ {
+ "time": "00:36:00",
+ "value": 60
+ },
+ {
+ "time": "00:37:00",
+ "value": 61
+ },
+ {
+ "time": "00:38:00",
+ "value": 62
+ },
+ {
+ "time": "00:39:00",
+ "value": 64
+ },
+ {
+ "time": "00:40:00",
+ "value": 58
+ },
+ {
+ "time": "00:41:00",
+ "value": 60
+ },
+ {
+ "time": "00:42:00",
+ "value": 61
+ },
+ {
+ "time": "00:43:00",
+ "value": 61
+ },
+ {
+ "time": "00:44:00",
+ "value": 61
+ },
+ {
+ "time": "00:45:00",
+ "value": 61
+ },
+ {
+ "time": "00:46:00",
+ "value": 63
+ },
+ {
+ "time": "00:47:00",
+ "value": 63
+ },
+ {
+ "time": "00:48:00",
+ "value": 63
+ },
+ {
+ "time": "00:49:00",
+ "value": 64
+ },
+ {
+ "time": "00:50:00",
+ "value": 62
+ },
+ {
+ "time": "00:51:00",
+ "value": 61
+ },
+ {
+ "time": "00:52:00",
+ "value": 62
+ },
+ {
+ "time": "00:53:00",
+ "value": 61
+ },
+ {
+ "time": "00:54:00",
+ "value": 61
+ },
+ {
+ "time": "00:55:00",
+ "value": 61
+ },
+ {
+ "time": "00:56:00",
+ "value": 61
+ },
+ {
+ "time": "00:57:00",
+ "value": 61
+ },
+ {
+ "time": "00:58:00",
+ "value": 61
+ },
+ {
+ "time": "00:59:00",
+ "value": 63
+ },
+ {
+ "time": "01:00:00",
+ "value": 63
+ },
+ {
+ "time": "01:01:00",
+ "value": 60
+ },
+ {
+ "time": "01:02:00",
+ "value": 66
+ },
+ {
+ "time": "01:03:00",
+ "value": 71
+ },
+ {
+ "time": "01:04:00",
+ "value": 63
+ },
+ {
+ "time": "01:05:00",
+ "value": 69
+ },
+ {
+ "time": "01:06:00",
+ "value": 62
+ },
+ {
+ "time": "01:07:00",
+ "value": 62
+ },
+ {
+ "time": "01:08:00",
+ "value": 63
+ },
+ {
+ "time": "01:09:00",
+ "value": 67
+ },
+ {
+ "time": "01:10:00",
+ "value": 61
+ },
+ {
+ "time": "01:11:00",
+ "value": 57
+ },
+ {
+ "time": "01:12:00",
+ "value": 58
+ },
+ {
+ "time": "01:13:00",
+ "value": 58
+ },
+ {
+ "time": "01:14:00",
+ "value": 55
+ },
+ {
+ "time": "01:15:00",
+ "value": 55
+ },
+ {
+ "time": "01:16:00",
+ "value": 60
+ },
+ {
+ "time": "01:17:00",
+ "value": 60
+ },
+ {
+ "time": "01:18:00",
+ "value": 59
+ },
+ {
+ "time": "01:19:00",
+ "value": 57
+ },
+ {
+ "time": "01:20:00",
+ "value": 55
+ },
+ {
+ "time": "01:21:00",
+ "value": 60
+ },
+ {
+ "time": "01:22:00",
+ "value": 57
+ },
+ {
+ "time": "01:23:00",
+ "value": 57
+ },
+ {
+ "time": "01:24:00",
+ "value": 55
+ },
+ {
+ "time": "01:25:00",
+ "value": 56
+ },
+ {
+ "time": "01:26:00",
+ "value": 57
+ },
+ {
+ "time": "01:27:00",
+ "value": 60
+ },
+ {
+ "time": "01:28:00",
+ "value": 64
+ },
+ {
+ "time": "01:29:00",
+ "value": 60
+ },
+ {
+ "time": "01:30:00",
+ "value": 62
+ },
+ {
+ "time": "01:31:00",
+ "value": 60
+ },
+ {
+ "time": "01:32:00",
+ "value": 62
+ },
+ {
+ "time": "01:33:00",
+ "value": 62
+ },
+ {
+ "time": "01:34:00",
+ "value": 63
+ },
+ {
+ "time": "01:35:00",
+ "value": 62
+ },
+ {
+ "time": "01:36:00",
+ "value": 63
+ },
+ {
+ "time": "01:37:00",
+ "value": 64
+ },
+ {
+ "time": "01:38:00",
+ "value": 62
+ },
+ {
+ "time": "01:39:00",
+ "value": 63
+ },
+ {
+ "time": "01:40:00",
+ "value": 64
+ },
+ {
+ "time": "01:41:00",
+ "value": 65
+ },
+ {
+ "time": "01:42:00",
+ "value": 66
+ },
+ {
+ "time": "01:43:00",
+ "value": 62
+ },
+ {
+ "time": "01:44:00",
+ "value": 61
+ },
+ {
+ "time": "01:45:00",
+ "value": 62
+ },
+ {
+ "time": "01:46:00",
+ "value": 64
+ },
+ {
+ "time": "01:47:00",
+ "value": 63
+ },
+ {
+ "time": "01:48:00",
+ "value": 63
+ },
+ {
+ "time": "01:49:00",
+ "value": 64
+ },
+ {
+ "time": "01:50:00",
+ "value": 64
+ },
+ {
+ "time": "01:51:00",
+ "value": 65
+ },
+ {
+ "time": "01:52:00",
+ "value": 64
+ },
+ {
+ "time": "01:53:00",
+ "value": 64
+ },
+ {
+ "time": "01:54:00",
+ "value": 64
+ },
+ {
+ "time": "01:55:00",
+ "value": 65
+ },
+ {
+ "time": "01:56:00",
+ "value": 67
+ },
+ {
+ "time": "01:57:00",
+ "value": 62
+ },
+ {
+ "time": "01:58:00",
+ "value": 63
+ },
+ {
+ "time": "01:59:00",
+ "value": 61
+ },
+ {
+ "time": "02:00:00",
+ "value": 61
+ },
+ {
+ "time": "02:01:00",
+ "value": 63
+ },
+ {
+ "time": "02:02:00",
+ "value": 62
+ },
+ {
+ "time": "02:03:00",
+ "value": 61
+ },
+ {
+ "time": "02:04:00",
+ "value": 60
+ },
+ {
+ "time": "02:05:00",
+ "value": 61
+ },
+ {
+ "time": "02:06:00",
+ "value": 61
+ },
+ {
+ "time": "02:07:00",
+ "value": 63
+ },
+ {
+ "time": "02:08:00",
+ "value": 63
+ },
+ {
+ "time": "02:09:00",
+ "value": 63
+ },
+ {
+ "time": "02:10:00",
+ "value": 65
+ },
+ {
+ "time": "02:11:00",
+ "value": 62
+ },
+ {
+ "time": "02:12:00",
+ "value": 62
+ },
+ {
+ "time": "02:13:00",
+ "value": 62
+ },
+ {
+ "time": "02:14:00",
+ "value": 60
+ },
+ {
+ "time": "02:15:00",
+ "value": 61
+ },
+ {
+ "time": "02:16:00",
+ "value": 62
+ },
+ {
+ "time": "02:17:00",
+ "value": 59
+ },
+ {
+ "time": "02:18:00",
+ "value": 60
+ },
+ {
+ "time": "02:19:00",
+ "value": 60
+ },
+ {
+ "time": "02:20:00",
+ "value": 60
+ },
+ {
+ "time": "02:21:00",
+ "value": 61
+ },
+ {
+ "time": "02:22:00",
+ "value": 61
+ },
+ {
+ "time": "02:23:00",
+ "value": 61
+ },
+ {
+ "time": "02:24:00",
+ "value": 61
+ },
+ {
+ "time": "02:25:00",
+ "value": 61
+ },
+ {
+ "time": "02:26:00",
+ "value": 61
+ },
+ {
+ "time": "02:27:00",
+ "value": 62
+ },
+ {
+ "time": "02:28:00",
+ "value": 59
+ },
+ {
+ "time": "02:29:00",
+ "value": 60
+ },
+ {
+ "time": "02:30:00",
+ "value": 61
+ },
+ {
+ "time": "02:31:00",
+ "value": 62
+ },
+ {
+ "time": "02:32:00",
+ "value": 60
+ },
+ {
+ "time": "02:33:00",
+ "value": 61
+ },
+ {
+ "time": "02:34:00",
+ "value": 61
+ },
+ {
+ "time": "02:35:00",
+ "value": 61
+ },
+ {
+ "time": "02:36:00",
+ "value": 61
+ },
+ {
+ "time": "02:37:00",
+ "value": 66
+ },
+ {
+ "time": "02:38:00",
+ "value": 68
+ },
+ {
+ "time": "02:39:00",
+ "value": 64
+ },
+ {
+ "time": "02:40:00",
+ "value": 58
+ },
+ {
+ "time": "02:41:00",
+ "value": 58
+ },
+ {
+ "time": "02:42:00",
+ "value": 57
+ },
+ {
+ "time": "02:43:00",
+ "value": 57
+ },
+ {
+ "time": "02:44:00",
+ "value": 58
+ },
+ {
+ "time": "02:45:00",
+ "value": 55
+ },
+ {
+ "time": "02:46:00",
+ "value": 59
+ },
+ {
+ "time": "02:47:00",
+ "value": 59
+ },
+ {
+ "time": "02:48:00",
+ "value": 56
+ },
+ {
+ "time": "02:49:00",
+ "value": 55
+ },
+ {
+ "time": "02:50:00",
+ "value": 58
+ },
+ {
+ "time": "02:51:00",
+ "value": 57
+ },
+ {
+ "time": "02:52:00",
+ "value": 55
+ },
+ {
+ "time": "02:53:00",
+ "value": 57
+ },
+ {
+ "time": "02:54:00",
+ "value": 61
+ },
+ {
+ "time": "02:55:00",
+ "value": 54
+ },
+ {
+ "time": "02:56:00",
+ "value": 59
+ },
+ {
+ "time": "02:57:00",
+ "value": 54
+ },
+ {
+ "time": "02:58:00",
+ "value": 56
+ },
+ {
+ "time": "02:59:00",
+ "value": 57
+ },
+ {
+ "time": "03:00:00",
+ "value": 57
+ },
+ {
+ "time": "03:01:00",
+ "value": 53
+ },
+ {
+ "time": "03:02:00",
+ "value": 54
+ },
+ {
+ "time": "03:03:00",
+ "value": 57
+ },
+ {
+ "time": "03:04:00",
+ "value": 54
+ },
+ {
+ "time": "03:05:00",
+ "value": 59
+ },
+ {
+ "time": "03:06:00",
+ "value": 59
+ },
+ {
+ "time": "03:07:00",
+ "value": 62
+ },
+ {
+ "time": "03:08:00",
+ "value": 62
+ },
+ {
+ "time": "03:09:00",
+ "value": 60
+ },
+ {
+ "time": "03:10:00",
+ "value": 68
+ },
+ {
+ "time": "03:11:00",
+ "value": 63
+ },
+ {
+ "time": "03:12:00",
+ "value": 57
+ },
+ {
+ "time": "03:13:00",
+ "value": 58
+ },
+ {
+ "time": "03:14:00",
+ "value": 57
+ },
+ {
+ "time": "03:15:00",
+ "value": 56
+ },
+ {
+ "time": "03:16:00",
+ "value": 59
+ },
+ {
+ "time": "03:17:00",
+ "value": 59
+ },
+ {
+ "time": "03:18:00",
+ "value": 58
+ },
+ {
+ "time": "03:19:00",
+ "value": 57
+ },
+ {
+ "time": "03:20:00",
+ "value": 55
+ },
+ {
+ "time": "03:21:00",
+ "value": 57
+ },
+ {
+ "time": "03:22:00",
+ "value": 57
+ },
+ {
+ "time": "03:23:00",
+ "value": 56
+ },
+ {
+ "time": "03:24:00",
+ "value": 56
+ },
+ {
+ "time": "03:25:00",
+ "value": 60
+ },
+ {
+ "time": "03:26:00",
+ "value": 58
+ },
+ {
+ "time": "03:27:00",
+ "value": 58
+ },
+ {
+ "time": "03:28:00",
+ "value": 60
+ },
+ {
+ "time": "03:29:00",
+ "value": 62
+ },
+ {
+ "time": "03:30:00",
+ "value": 58
+ },
+ {
+ "time": "03:31:00",
+ "value": 61
+ },
+ {
+ "time": "03:32:00",
+ "value": 61
+ },
+ {
+ "time": "03:33:00",
+ "value": 62
+ },
+ {
+ "time": "03:34:00",
+ "value": 61
+ },
+ {
+ "time": "03:35:00",
+ "value": 62
+ },
+ {
+ "time": "03:36:00",
+ "value": 61
+ },
+ {
+ "time": "03:37:00",
+ "value": 62
+ },
+ {
+ "time": "03:38:00",
+ "value": 61
+ },
+ {
+ "time": "03:39:00",
+ "value": 62
+ },
+ {
+ "time": "03:40:00",
+ "value": 63
+ },
+ {
+ "time": "03:41:00",
+ "value": 62
+ },
+ {
+ "time": "03:42:00",
+ "value": 64
+ },
+ {
+ "time": "03:43:00",
+ "value": 59
+ },
+ {
+ "time": "03:44:00",
+ "value": 59
+ },
+ {
+ "time": "03:45:00",
+ "value": 61
+ },
+ {
+ "time": "03:46:00",
+ "value": 61
+ },
+ {
+ "time": "03:47:00",
+ "value": 58
+ },
+ {
+ "time": "03:48:00",
+ "value": 60
+ },
+ {
+ "time": "03:49:00",
+ "value": 60
+ },
+ {
+ "time": "03:50:00",
+ "value": 61
+ },
+ {
+ "time": "03:51:00",
+ "value": 63
+ },
+ {
+ "time": "03:52:00",
+ "value": 61
+ },
+ {
+ "time": "03:53:00",
+ "value": 60
+ },
+ {
+ "time": "03:54:00",
+ "value": 58
+ },
+ {
+ "time": "03:55:00",
+ "value": 58
+ },
+ {
+ "time": "03:56:00",
+ "value": 60
+ },
+ {
+ "time": "03:57:00",
+ "value": 60
+ },
+ {
+ "time": "03:58:00",
+ "value": 61
+ },
+ {
+ "time": "03:59:00",
+ "value": 60
+ },
+ {
+ "time": "04:00:00",
+ "value": 60
+ },
+ {
+ "time": "04:01:00",
+ "value": 60
+ },
+ {
+ "time": "04:02:00",
+ "value": 60
+ },
+ {
+ "time": "04:03:00",
+ "value": 62
+ },
+ {
+ "time": "04:04:00",
+ "value": 60
+ },
+ {
+ "time": "04:05:00",
+ "value": 61
+ },
+ {
+ "time": "04:06:00",
+ "value": 61
+ },
+ {
+ "time": "04:07:00",
+ "value": 60
+ },
+ {
+ "time": "04:08:00",
+ "value": 60
+ },
+ {
+ "time": "04:09:00",
+ "value": 60
+ },
+ {
+ "time": "04:10:00",
+ "value": 60
+ },
+ {
+ "time": "04:11:00",
+ "value": 60
+ },
+ {
+ "time": "04:12:00",
+ "value": 60
+ },
+ {
+ "time": "04:13:00",
+ "value": 60
+ },
+ {
+ "time": "04:14:00",
+ "value": 59
+ },
+ {
+ "time": "04:15:00",
+ "value": 63
+ },
+ {
+ "time": "04:16:00",
+ "value": 57
+ },
+ {
+ "time": "04:17:00",
+ "value": 58
+ },
+ {
+ "time": "04:18:00",
+ "value": 58
+ },
+ {
+ "time": "04:19:00",
+ "value": 58
+ },
+ {
+ "time": "04:20:00",
+ "value": 57
+ },
+ {
+ "time": "04:21:00",
+ "value": 58
+ },
+ {
+ "time": "04:22:00",
+ "value": 58
+ },
+ {
+ "time": "04:23:00",
+ "value": 58
+ },
+ {
+ "time": "04:24:00",
+ "value": 59
+ },
+ {
+ "time": "04:25:00",
+ "value": 57
+ },
+ {
+ "time": "04:26:00",
+ "value": 56
+ },
+ {
+ "time": "04:27:00",
+ "value": 58
+ },
+ {
+ "time": "04:28:00",
+ "value": 58
+ },
+ {
+ "time": "04:29:00",
+ "value": 58
+ },
+ {
+ "time": "04:30:00",
+ "value": 59
+ },
+ {
+ "time": "04:31:00",
+ "value": 59
+ },
+ {
+ "time": "04:32:00",
+ "value": 58
+ },
+ {
+ "time": "04:33:00",
+ "value": 58
+ },
+ {
+ "time": "04:34:00",
+ "value": 59
+ },
+ {
+ "time": "04:35:00",
+ "value": 59
+ },
+ {
+ "time": "04:36:00",
+ "value": 59
+ },
+ {
+ "time": "04:37:00",
+ "value": 60
+ },
+ {
+ "time": "04:38:00",
+ "value": 60
+ },
+ {
+ "time": "04:39:00",
+ "value": 58
+ },
+ {
+ "time": "04:40:00",
+ "value": 58
+ },
+ {
+ "time": "04:41:00",
+ "value": 57
+ },
+ {
+ "time": "04:42:00",
+ "value": 60
+ },
+ {
+ "time": "04:43:00",
+ "value": 59
+ },
+ {
+ "time": "04:44:00",
+ "value": 57
+ },
+ {
+ "time": "04:45:00",
+ "value": 59
+ },
+ {
+ "time": "04:46:00",
+ "value": 59
+ },
+ {
+ "time": "04:47:00",
+ "value": 60
+ },
+ {
+ "time": "04:48:00",
+ "value": 56
+ },
+ {
+ "time": "04:49:00",
+ "value": 55
+ },
+ {
+ "time": "04:50:00",
+ "value": 58
+ },
+ {
+ "time": "04:51:00",
+ "value": 55
+ },
+ {
+ "time": "04:52:00",
+ "value": 54
+ },
+ {
+ "time": "04:53:00",
+ "value": 56
+ },
+ {
+ "time": "04:54:00",
+ "value": 56
+ },
+ {
+ "time": "04:55:00",
+ "value": 57
+ },
+ {
+ "time": "04:56:00",
+ "value": 55
+ },
+ {
+ "time": "04:57:00",
+ "value": 53
+ },
+ {
+ "time": "04:58:00",
+ "value": 58
+ },
+ {
+ "time": "04:59:00",
+ "value": 55
+ },
+ {
+ "time": "05:00:00",
+ "value": 59
+ },
+ {
+ "time": "05:01:00",
+ "value": 56
+ },
+ {
+ "time": "05:02:00",
+ "value": 56
+ },
+ {
+ "time": "05:03:00",
+ "value": 55
+ },
+ {
+ "time": "05:04:00",
+ "value": 57
+ },
+ {
+ "time": "05:05:00",
+ "value": 56
+ },
+ {
+ "time": "05:06:00",
+ "value": 56
+ },
+ {
+ "time": "05:07:00",
+ "value": 57
+ },
+ {
+ "time": "05:08:00",
+ "value": 58
+ },
+ {
+ "time": "05:09:00",
+ "value": 56
+ },
+ {
+ "time": "05:10:00",
+ "value": 56
+ },
+ {
+ "time": "05:11:00",
+ "value": 57
+ },
+ {
+ "time": "05:12:00",
+ "value": 58
+ },
+ {
+ "time": "05:13:00",
+ "value": 58
+ },
+ {
+ "time": "05:14:00",
+ "value": 58
+ },
+ {
+ "time": "05:15:00",
+ "value": 58
+ },
+ {
+ "time": "05:16:00",
+ "value": 60
+ },
+ {
+ "time": "05:17:00",
+ "value": 60
+ },
+ {
+ "time": "05:18:00",
+ "value": 63
+ },
+ {
+ "time": "05:19:00",
+ "value": 55
+ },
+ {
+ "time": "05:20:00",
+ "value": 57
+ },
+ {
+ "time": "05:21:00",
+ "value": 61
+ },
+ {
+ "time": "05:22:00",
+ "value": 57
+ },
+ {
+ "time": "05:23:00",
+ "value": 59
+ },
+ {
+ "time": "05:24:00",
+ "value": 59
+ },
+ {
+ "time": "05:25:00",
+ "value": 61
+ },
+ {
+ "time": "05:26:00",
+ "value": 59
+ },
+ {
+ "time": "05:27:00",
+ "value": 59
+ },
+ {
+ "time": "05:28:00",
+ "value": 60
+ },
+ {
+ "time": "05:29:00",
+ "value": 61
+ },
+ {
+ "time": "05:30:00",
+ "value": 61
+ },
+ {
+ "time": "05:31:00",
+ "value": 62
+ },
+ {
+ "time": "05:32:00",
+ "value": 62
+ },
+ {
+ "time": "05:33:00",
+ "value": 59
+ },
+ {
+ "time": "05:34:00",
+ "value": 59
+ },
+ {
+ "time": "05:35:00",
+ "value": 60
+ },
+ {
+ "time": "05:36:00",
+ "value": 60
+ },
+ {
+ "time": "05:37:00",
+ "value": 63
+ },
+ {
+ "time": "05:38:00",
+ "value": 62
+ },
+ {
+ "time": "05:39:00",
+ "value": 61
+ },
+ {
+ "time": "05:40:00",
+ "value": 62
+ },
+ {
+ "time": "05:41:00",
+ "value": 62
+ },
+ {
+ "time": "05:42:00",
+ "value": 62
+ },
+ {
+ "time": "05:43:00",
+ "value": 61
+ },
+ {
+ "time": "05:44:00",
+ "value": 62
+ },
+ {
+ "time": "05:45:00",
+ "value": 62
+ },
+ {
+ "time": "05:46:00",
+ "value": 62
+ },
+ {
+ "time": "05:47:00",
+ "value": 62
+ },
+ {
+ "time": "05:48:00",
+ "value": 63
+ },
+ {
+ "time": "05:49:00",
+ "value": 59
+ },
+ {
+ "time": "05:50:00",
+ "value": 60
+ },
+ {
+ "time": "05:51:00",
+ "value": 60
+ },
+ {
+ "time": "05:52:00",
+ "value": 61
+ },
+ {
+ "time": "05:53:00",
+ "value": 60
+ },
+ {
+ "time": "05:54:00",
+ "value": 63
+ },
+ {
+ "time": "05:55:00",
+ "value": 64
+ },
+ {
+ "time": "05:56:00",
+ "value": 60
+ },
+ {
+ "time": "05:57:00",
+ "value": 60
+ },
+ {
+ "time": "05:58:00",
+ "value": 59
+ },
+ {
+ "time": "05:59:00",
+ "value": 58
+ },
+ {
+ "time": "06:00:00",
+ "value": 57
+ },
+ {
+ "time": "06:01:00",
+ "value": 56
+ },
+ {
+ "time": "06:02:00",
+ "value": 57
+ },
+ {
+ "time": "06:03:00",
+ "value": 56
+ },
+ {
+ "time": "06:04:00",
+ "value": 56
+ },
+ {
+ "time": "06:05:00",
+ "value": 60
+ },
+ {
+ "time": "06:06:00",
+ "value": 55
+ },
+ {
+ "time": "06:07:00",
+ "value": 56
+ },
+ {
+ "time": "06:08:00",
+ "value": 55
+ },
+ {
+ "time": "06:09:00",
+ "value": 53
+ },
+ {
+ "time": "06:10:00",
+ "value": 56
+ },
+ {
+ "time": "06:11:00",
+ "value": 58
+ },
+ {
+ "time": "06:12:00",
+ "value": 61
+ },
+ {
+ "time": "06:13:00",
+ "value": 61
+ },
+ {
+ "time": "06:14:00",
+ "value": 58
+ },
+ {
+ "time": "06:15:00",
+ "value": 56
+ },
+ {
+ "time": "06:16:00",
+ "value": 57
+ },
+ {
+ "time": "06:17:00",
+ "value": 55
+ },
+ {
+ "time": "06:18:00",
+ "value": 57
+ },
+ {
+ "time": "06:19:00",
+ "value": 55
+ },
+ {
+ "time": "06:20:00",
+ "value": 60
+ },
+ {
+ "time": "06:21:00",
+ "value": 57
+ },
+ {
+ "time": "06:22:00",
+ "value": 56
+ },
+ {
+ "time": "06:23:00",
+ "value": 57
+ },
+ {
+ "time": "06:24:00",
+ "value": 57
+ },
+ {
+ "time": "06:25:00",
+ "value": 53
+ },
+ {
+ "time": "06:26:00",
+ "value": 54
+ },
+ {
+ "time": "06:27:00",
+ "value": 56
+ },
+ {
+ "time": "06:28:00",
+ "value": 54
+ },
+ {
+ "time": "06:29:00",
+ "value": 52
+ },
+ {
+ "time": "06:30:00",
+ "value": 53
+ },
+ {
+ "time": "06:31:00",
+ "value": 60
+ },
+ {
+ "time": "06:32:00",
+ "value": 60
+ },
+ {
+ "time": "06:33:00",
+ "value": 53
+ },
+ {
+ "time": "06:34:00",
+ "value": 56
+ },
+ {
+ "time": "06:35:00",
+ "value": 59
+ },
+ {
+ "time": "06:36:00",
+ "value": 59
+ },
+ {
+ "time": "06:37:00",
+ "value": 60
+ },
+ {
+ "time": "06:38:00",
+ "value": 60
+ },
+ {
+ "time": "06:39:00",
+ "value": 64
+ },
+ {
+ "time": "06:40:00",
+ "value": 64
+ },
+ {
+ "time": "06:41:00",
+ "value": 65
+ },
+ {
+ "time": "06:42:00",
+ "value": 59
+ },
+ {
+ "time": "06:43:00",
+ "value": 64
+ },
+ {
+ "time": "06:44:00",
+ "value": 62
+ },
+ {
+ "time": "06:45:00",
+ "value": 59
+ },
+ {
+ "time": "06:46:00",
+ "value": 59
+ },
+ {
+ "time": "06:47:00",
+ "value": 63
+ },
+ {
+ "time": "06:48:00",
+ "value": 75
+ },
+ {
+ "time": "06:49:00",
+ "value": 71
+ },
+ {
+ "time": "06:50:00",
+ "value": 65
+ },
+ {
+ "time": "07:00:00",
+ "value": 72
+ },
+ {
+ "time": "07:01:00",
+ "value": 78
+ },
+ {
+ "time": "07:02:00",
+ "value": 82
+ },
+ {
+ "time": "07:03:00",
+ "value": 71
+ },
+ {
+ "time": "07:04:00",
+ "value": 63
+ },
+ {
+ "time": "07:05:00",
+ "value": 63
+ },
+ {
+ "time": "07:06:00",
+ "value": 64
+ },
+ {
+ "time": "07:07:00",
+ "value": 64
+ },
+ {
+ "time": "07:08:00",
+ "value": 66
+ },
+ {
+ "time": "07:09:00",
+ "value": 71
+ },
+ {
+ "time": "07:10:00",
+ "value": 79
+ },
+ {
+ "time": "07:11:00",
+ "value": 85
+ },
+ {
+ "time": "07:12:00",
+ "value": 84
+ },
+ {
+ "time": "07:13:00",
+ "value": 83
+ },
+ {
+ "time": "07:14:00",
+ "value": 83
+ },
+ {
+ "time": "07:15:00",
+ "value": 82
+ },
+ {
+ "time": "07:16:00",
+ "value": 83
+ },
+ {
+ "time": "07:17:00",
+ "value": 86
+ },
+ {
+ "time": "07:18:00",
+ "value": 86
+ },
+ {
+ "time": "07:19:00",
+ "value": 88
+ },
+ {
+ "time": "07:20:00",
+ "value": 84
+ },
+ {
+ "time": "07:21:00",
+ "value": 90
+ },
+ {
+ "time": "07:22:00",
+ "value": 97
+ },
+ {
+ "time": "07:23:00",
+ "value": 84
+ },
+ {
+ "time": "07:24:00",
+ "value": 72
+ },
+ {
+ "time": "07:25:00",
+ "value": 71
+ },
+ {
+ "time": "07:26:00",
+ "value": 71
+ },
+ {
+ "time": "07:27:00",
+ "value": 83
+ },
+ {
+ "time": "07:28:00",
+ "value": 95
+ },
+ {
+ "time": "07:29:00",
+ "value": 109
+ },
+ {
+ "time": "07:30:00",
+ "value": 113
+ },
+ {
+ "time": "07:31:00",
+ "value": 114
+ },
+ {
+ "time": "07:32:00",
+ "value": 109
+ },
+ {
+ "time": "07:33:00",
+ "value": 120
+ },
+ {
+ "time": "07:34:00",
+ "value": 103
+ },
+ {
+ "time": "07:36:00",
+ "value": 87
+ },
+ {
+ "time": "07:37:00",
+ "value": 86
+ },
+ {
+ "time": "07:38:00",
+ "value": 86
+ },
+ {
+ "time": "07:39:00",
+ "value": 87
+ },
+ {
+ "time": "07:40:00",
+ "value": 88
+ },
+ {
+ "time": "07:41:00",
+ "value": 80
+ },
+ {
+ "time": "07:42:00",
+ "value": 80
+ },
+ {
+ "time": "07:43:00",
+ "value": 82
+ },
+ {
+ "time": "07:44:00",
+ "value": 90
+ },
+ {
+ "time": "07:45:00",
+ "value": 87
+ },
+ {
+ "time": "07:46:00",
+ "value": 86
+ },
+ {
+ "time": "07:47:00",
+ "value": 82
+ },
+ {
+ "time": "07:48:00",
+ "value": 96
+ },
+ {
+ "time": "07:49:00",
+ "value": 97
+ },
+ {
+ "time": "07:50:00",
+ "value": 100
+ },
+ {
+ "time": "07:51:00",
+ "value": 100
+ },
+ {
+ "time": "07:52:00",
+ "value": 89
+ },
+ {
+ "time": "07:53:00",
+ "value": 86
+ },
+ {
+ "time": "07:54:00",
+ "value": 79
+ },
+ {
+ "time": "07:55:00",
+ "value": 79
+ },
+ {
+ "time": "07:56:00",
+ "value": 78
+ },
+ {
+ "time": "07:57:00",
+ "value": 83
+ },
+ {
+ "time": "07:58:00",
+ "value": 90
+ },
+ {
+ "time": "07:59:00",
+ "value": 93
+ },
+ {
+ "time": "08:00:00",
+ "value": 100
+ },
+ {
+ "time": "08:01:00",
+ "value": 104
+ },
+ {
+ "time": "08:02:00",
+ "value": 104
+ },
+ {
+ "time": "08:03:00",
+ "value": 105
+ },
+ {
+ "time": "08:04:00",
+ "value": 107
+ },
+ {
+ "time": "08:05:00",
+ "value": 105
+ },
+ {
+ "time": "08:06:00",
+ "value": 102
+ },
+ {
+ "time": "08:07:00",
+ "value": 101
+ },
+ {
+ "time": "08:08:00",
+ "value": 101
+ },
+ {
+ "time": "08:42:00",
+ "value": 79
+ },
+ {
+ "time": "08:43:00",
+ "value": 75
+ },
+ {
+ "time": "08:44:00",
+ "value": 72
+ },
+ {
+ "time": "08:45:00",
+ "value": 73
+ },
+ {
+ "time": "08:46:00",
+ "value": 79
+ },
+ {
+ "time": "08:47:00",
+ "value": 66
+ },
+ {
+ "time": "08:48:00",
+ "value": 69
+ },
+ {
+ "time": "08:49:00",
+ "value": 71
+ },
+ {
+ "time": "08:50:00",
+ "value": 72
+ },
+ {
+ "time": "08:51:00",
+ "value": 75
+ },
+ {
+ "time": "08:52:00",
+ "value": 76
+ },
+ {
+ "time": "08:53:00",
+ "value": 75
+ },
+ {
+ "time": "08:54:00",
+ "value": 74
+ },
+ {
+ "time": "08:55:00",
+ "value": 72
+ },
+ {
+ "time": "08:56:00",
+ "value": 74
+ },
+ {
+ "time": "08:57:00",
+ "value": 76
+ },
+ {
+ "time": "08:58:00",
+ "value": 71
+ },
+ {
+ "time": "08:59:00",
+ "value": 69
+ },
+ {
+ "time": "09:00:00",
+ "value": 67
+ },
+ {
+ "time": "09:01:00",
+ "value": 69
+ },
+ {
+ "time": "09:02:00",
+ "value": 71
+ },
+ {
+ "time": "09:03:00",
+ "value": 72
+ },
+ {
+ "time": "09:04:00",
+ "value": 74
+ },
+ {
+ "time": "09:05:00",
+ "value": 75
+ },
+ {
+ "time": "09:06:00",
+ "value": 72
+ },
+ {
+ "time": "09:07:00",
+ "value": 70
+ },
+ {
+ "time": "09:08:00",
+ "value": 70
+ },
+ {
+ "time": "09:09:00",
+ "value": 69
+ },
+ {
+ "time": "09:10:00",
+ "value": 71
+ },
+ {
+ "time": "09:11:00",
+ "value": 73
+ },
+ {
+ "time": "09:12:00",
+ "value": 72
+ },
+ {
+ "time": "09:13:00",
+ "value": 67
+ },
+ {
+ "time": "09:14:00",
+ "value": 65
+ },
+ {
+ "time": "09:15:00",
+ "value": 73
+ },
+ {
+ "time": "09:16:00",
+ "value": 72
+ },
+ {
+ "time": "09:17:00",
+ "value": 67
+ },
+ {
+ "time": "09:18:00",
+ "value": 68
+ },
+ {
+ "time": "09:19:00",
+ "value": 73
+ },
+ {
+ "time": "09:20:00",
+ "value": 74
+ },
+ {
+ "time": "09:21:00",
+ "value": 75
+ },
+ {
+ "time": "09:22:00",
+ "value": 74
+ },
+ {
+ "time": "09:23:00",
+ "value": 74
+ },
+ {
+ "time": "09:24:00",
+ "value": 76
+ },
+ {
+ "time": "09:25:00",
+ "value": 73
+ },
+ {
+ "time": "09:26:00",
+ "value": 77
+ },
+ {
+ "time": "09:27:00",
+ "value": 77
+ },
+ {
+ "time": "09:28:00",
+ "value": 78
+ },
+ {
+ "time": "09:29:00",
+ "value": 77
+ },
+ {
+ "time": "09:30:00",
+ "value": 75
+ },
+ {
+ "time": "09:31:00",
+ "value": 74
+ },
+ {
+ "time": "09:32:00",
+ "value": 76
+ },
+ {
+ "time": "09:33:00",
+ "value": 76
+ },
+ {
+ "time": "09:34:00",
+ "value": 73
+ },
+ {
+ "time": "09:35:00",
+ "value": 73
+ },
+ {
+ "time": "09:36:00",
+ "value": 70
+ },
+ {
+ "time": "09:37:00",
+ "value": 68
+ },
+ {
+ "time": "09:38:00",
+ "value": 70
+ },
+ {
+ "time": "09:39:00",
+ "value": 68
+ },
+ {
+ "time": "09:40:00",
+ "value": 67
+ },
+ {
+ "time": "09:41:00",
+ "value": 65
+ },
+ {
+ "time": "09:42:00",
+ "value": 68
+ },
+ {
+ "time": "09:43:00",
+ "value": 71
+ },
+ {
+ "time": "09:44:00",
+ "value": 71
+ },
+ {
+ "time": "09:45:00",
+ "value": 74
+ },
+ {
+ "time": "09:46:00",
+ "value": 72
+ },
+ {
+ "time": "09:47:00",
+ "value": 74
+ },
+ {
+ "time": "09:48:00",
+ "value": 74
+ },
+ {
+ "time": "09:49:00",
+ "value": 72
+ },
+ {
+ "time": "09:50:00",
+ "value": 72
+ },
+ {
+ "time": "09:51:00",
+ "value": 73
+ },
+ {
+ "time": "09:52:00",
+ "value": 74
+ },
+ {
+ "time": "09:53:00",
+ "value": 71
+ },
+ {
+ "time": "09:54:00",
+ "value": 73
+ },
+ {
+ "time": "09:55:00",
+ "value": 73
+ },
+ {
+ "time": "09:56:00",
+ "value": 73
+ },
+ {
+ "time": "09:57:00",
+ "value": 74
+ },
+ {
+ "time": "09:58:00",
+ "value": 73
+ },
+ {
+ "time": "09:59:00",
+ "value": 74
+ },
+ {
+ "time": "10:00:00",
+ "value": 74
+ },
+ {
+ "time": "10:01:00",
+ "value": 73
+ },
+ {
+ "time": "10:02:00",
+ "value": 74
+ },
+ {
+ "time": "10:03:00",
+ "value": 72
+ },
+ {
+ "time": "10:04:00",
+ "value": 70
+ },
+ {
+ "time": "10:05:00",
+ "value": 74
+ },
+ {
+ "time": "10:06:00",
+ "value": 73
+ },
+ {
+ "time": "10:07:00",
+ "value": 75
+ },
+ {
+ "time": "10:08:00",
+ "value": 74
+ },
+ {
+ "time": "10:09:00",
+ "value": 73
+ },
+ {
+ "time": "10:10:00",
+ "value": 74
+ },
+ {
+ "time": "10:11:00",
+ "value": 74
+ },
+ {
+ "time": "10:12:00",
+ "value": 75
+ },
+ {
+ "time": "10:13:00",
+ "value": 74
+ },
+ {
+ "time": "10:14:00",
+ "value": 74
+ },
+ {
+ "time": "10:15:00",
+ "value": 74
+ },
+ {
+ "time": "10:16:00",
+ "value": 74
+ },
+ {
+ "time": "10:17:00",
+ "value": 74
+ },
+ {
+ "time": "10:18:00",
+ "value": 74
+ },
+ {
+ "time": "10:19:00",
+ "value": 75
+ },
+ {
+ "time": "10:20:00",
+ "value": 74
+ },
+ {
+ "time": "10:21:00",
+ "value": 73
+ },
+ {
+ "time": "10:22:00",
+ "value": 69
+ },
+ {
+ "time": "10:23:00",
+ "value": 67
+ },
+ {
+ "time": "10:24:00",
+ "value": 69
+ },
+ {
+ "time": "10:25:00",
+ "value": 73
+ },
+ {
+ "time": "10:26:00",
+ "value": 71
+ },
+ {
+ "time": "10:27:00",
+ "value": 67
+ },
+ {
+ "time": "10:28:00",
+ "value": 72
+ },
+ {
+ "time": "10:29:00",
+ "value": 71
+ },
+ {
+ "time": "10:30:00",
+ "value": 72
+ },
+ {
+ "time": "10:31:00",
+ "value": 71
+ },
+ {
+ "time": "10:32:00",
+ "value": 72
+ },
+ {
+ "time": "10:33:00",
+ "value": 73
+ },
+ {
+ "time": "10:34:00",
+ "value": 67
+ },
+ {
+ "time": "10:35:00",
+ "value": 67
+ },
+ {
+ "time": "10:36:00",
+ "value": 62
+ },
+ {
+ "time": "10:37:00",
+ "value": 72
+ },
+ {
+ "time": "10:38:00",
+ "value": 75
+ },
+ {
+ "time": "10:39:00",
+ "value": 74
+ },
+ {
+ "time": "10:40:00",
+ "value": 74
+ },
+ {
+ "time": "10:41:00",
+ "value": 78
+ },
+ {
+ "time": "10:42:00",
+ "value": 76
+ },
+ {
+ "time": "10:43:00",
+ "value": 75
+ },
+ {
+ "time": "10:44:00",
+ "value": 74
+ },
+ {
+ "time": "10:45:00",
+ "value": 74
+ },
+ {
+ "time": "10:46:00",
+ "value": 72
+ },
+ {
+ "time": "10:47:00",
+ "value": 72
+ },
+ {
+ "time": "10:48:00",
+ "value": 71
+ },
+ {
+ "time": "10:49:00",
+ "value": 71
+ },
+ {
+ "time": "10:50:00",
+ "value": 75
+ },
+ {
+ "time": "10:51:00",
+ "value": 78
+ },
+ {
+ "time": "10:52:00",
+ "value": 78
+ },
+ {
+ "time": "10:53:00",
+ "value": 73
+ },
+ {
+ "time": "10:54:00",
+ "value": 75
+ },
+ {
+ "time": "10:55:00",
+ "value": 69
+ },
+ {
+ "time": "10:56:00",
+ "value": 70
+ },
+ {
+ "time": "10:57:00",
+ "value": 74
+ },
+ {
+ "time": "10:58:00",
+ "value": 74
+ },
+ {
+ "time": "10:59:00",
+ "value": 70
+ },
+ {
+ "time": "11:00:00",
+ "value": 71
+ },
+ {
+ "time": "11:01:00",
+ "value": 72
+ },
+ {
+ "time": "11:02:00",
+ "value": 73
+ },
+ {
+ "time": "11:03:00",
+ "value": 76
+ },
+ {
+ "time": "11:04:00",
+ "value": 79
+ },
+ {
+ "time": "11:05:00",
+ "value": 79
+ },
+ {
+ "time": "11:06:00",
+ "value": 72
+ },
+ {
+ "time": "11:07:00",
+ "value": 74
+ },
+ {
+ "time": "11:08:00",
+ "value": 74
+ },
+ {
+ "time": "11:09:00",
+ "value": 73
+ },
+ {
+ "time": "11:10:00",
+ "value": 70
+ },
+ {
+ "time": "11:11:00",
+ "value": 78
+ },
+ {
+ "time": "11:12:00",
+ "value": 74
+ },
+ {
+ "time": "11:13:00",
+ "value": 70
+ },
+ {
+ "time": "11:14:00",
+ "value": 70
+ },
+ {
+ "time": "11:15:00",
+ "value": 68
+ },
+ {
+ "time": "11:16:00",
+ "value": 68
+ },
+ {
+ "time": "11:17:00",
+ "value": 68
+ },
+ {
+ "time": "11:18:00",
+ "value": 71
+ },
+ {
+ "time": "11:19:00",
+ "value": 70
+ },
+ {
+ "time": "11:20:00",
+ "value": 73
+ },
+ {
+ "time": "11:21:00",
+ "value": 72
+ },
+ {
+ "time": "11:22:00",
+ "value": 72
+ },
+ {
+ "time": "11:23:00",
+ "value": 70
+ },
+ {
+ "time": "11:24:00",
+ "value": 70
+ },
+ {
+ "time": "11:25:00",
+ "value": 71
+ },
+ {
+ "time": "11:26:00",
+ "value": 71
+ },
+ {
+ "time": "11:27:00",
+ "value": 73
+ },
+ {
+ "time": "11:28:00",
+ "value": 73
+ },
+ {
+ "time": "11:29:00",
+ "value": 71
+ },
+ {
+ "time": "11:30:00",
+ "value": 68
+ },
+ {
+ "time": "11:31:00",
+ "value": 63
+ },
+ {
+ "time": "11:32:00",
+ "value": 64
+ },
+ {
+ "time": "11:33:00",
+ "value": 65
+ },
+ {
+ "time": "11:34:00",
+ "value": 66
+ },
+ {
+ "time": "11:35:00",
+ "value": 68
+ },
+ {
+ "time": "11:36:00",
+ "value": 78
+ },
+ {
+ "time": "11:37:00",
+ "value": 79
+ },
+ {
+ "time": "11:38:00",
+ "value": 80
+ },
+ {
+ "time": "11:39:00",
+ "value": 75
+ },
+ {
+ "time": "11:40:00",
+ "value": 73
+ },
+ {
+ "time": "11:41:00",
+ "value": 73
+ },
+ {
+ "time": "11:42:00",
+ "value": 73
+ },
+ {
+ "time": "11:43:00",
+ "value": 73
+ },
+ {
+ "time": "11:44:00",
+ "value": 74
+ },
+ {
+ "time": "11:45:00",
+ "value": 75
+ },
+ {
+ "time": "11:46:00",
+ "value": 75
+ },
+ {
+ "time": "11:47:00",
+ "value": 74
+ },
+ {
+ "time": "11:48:00",
+ "value": 74
+ },
+ {
+ "time": "11:49:00",
+ "value": 75
+ },
+ {
+ "time": "11:50:00",
+ "value": 75
+ },
+ {
+ "time": "11:51:00",
+ "value": 75
+ },
+ {
+ "time": "11:52:00",
+ "value": 76
+ },
+ {
+ "time": "11:53:00",
+ "value": 80
+ },
+ {
+ "time": "11:54:00",
+ "value": 80
+ },
+ {
+ "time": "11:55:00",
+ "value": 79
+ },
+ {
+ "time": "11:56:00",
+ "value": 80
+ },
+ {
+ "time": "11:57:00",
+ "value": 80
+ },
+ {
+ "time": "11:58:00",
+ "value": 81
+ },
+ {
+ "time": "11:59:00",
+ "value": 86
+ },
+ {
+ "time": "12:00:00",
+ "value": 67
+ },
+ {
+ "time": "12:01:00",
+ "value": 67
+ },
+ {
+ "time": "12:02:00",
+ "value": 71
+ },
+ {
+ "time": "12:03:00",
+ "value": 69
+ },
+ {
+ "time": "12:04:00",
+ "value": 72
+ },
+ {
+ "time": "12:05:00",
+ "value": 76
+ },
+ {
+ "time": "12:06:00",
+ "value": 78
+ },
+ {
+ "time": "12:07:00",
+ "value": 71
+ },
+ {
+ "time": "12:08:00",
+ "value": 72
+ },
+ {
+ "time": "12:09:00",
+ "value": 74
+ },
+ {
+ "time": "12:10:00",
+ "value": 76
+ },
+ {
+ "time": "12:11:00",
+ "value": 77
+ },
+ {
+ "time": "12:12:00",
+ "value": 75
+ },
+ {
+ "time": "12:13:00",
+ "value": 76
+ },
+ {
+ "time": "12:14:00",
+ "value": 77
+ },
+ {
+ "time": "12:15:00",
+ "value": 78
+ },
+ {
+ "time": "12:16:00",
+ "value": 79
+ },
+ {
+ "time": "12:17:00",
+ "value": 78
+ },
+ {
+ "time": "12:18:00",
+ "value": 77
+ },
+ {
+ "time": "12:19:00",
+ "value": 77
+ },
+ {
+ "time": "12:20:00",
+ "value": 79
+ },
+ {
+ "time": "12:21:00",
+ "value": 80
+ },
+ {
+ "time": "12:22:00",
+ "value": 79
+ },
+ {
+ "time": "12:23:00",
+ "value": 76
+ },
+ {
+ "time": "12:24:00",
+ "value": 77
+ },
+ {
+ "time": "12:25:00",
+ "value": 78
+ },
+ {
+ "time": "12:26:00",
+ "value": 79
+ },
+ {
+ "time": "12:27:00",
+ "value": 77
+ },
+ {
+ "time": "12:28:00",
+ "value": 78
+ },
+ {
+ "time": "12:29:00",
+ "value": 78
+ },
+ {
+ "time": "12:30:00",
+ "value": 79
+ },
+ {
+ "time": "12:31:00",
+ "value": 77
+ },
+ {
+ "time": "12:32:00",
+ "value": 78
+ },
+ {
+ "time": "12:33:00",
+ "value": 78
+ },
+ {
+ "time": "12:34:00",
+ "value": 78
+ },
+ {
+ "time": "12:35:00",
+ "value": 77
+ },
+ {
+ "time": "12:36:00",
+ "value": 77
+ },
+ {
+ "time": "12:37:00",
+ "value": 77
+ },
+ {
+ "time": "12:38:00",
+ "value": 77
+ },
+ {
+ "time": "12:39:00",
+ "value": 76
+ },
+ {
+ "time": "12:40:00",
+ "value": 77
+ },
+ {
+ "time": "12:41:00",
+ "value": 76
+ },
+ {
+ "time": "12:42:00",
+ "value": 77
+ },
+ {
+ "time": "12:43:00",
+ "value": 77
+ },
+ {
+ "time": "12:44:00",
+ "value": 75
+ },
+ {
+ "time": "12:45:00",
+ "value": 76
+ },
+ {
+ "time": "12:46:00",
+ "value": 74
+ },
+ {
+ "time": "12:47:00",
+ "value": 77
+ },
+ {
+ "time": "12:48:00",
+ "value": 75
+ },
+ {
+ "time": "12:49:00",
+ "value": 71
+ },
+ {
+ "time": "12:50:00",
+ "value": 75
+ },
+ {
+ "time": "12:51:00",
+ "value": 76
+ },
+ {
+ "time": "12:52:00",
+ "value": 78
+ },
+ {
+ "time": "12:53:00",
+ "value": 76
+ },
+ {
+ "time": "12:54:00",
+ "value": 77
+ },
+ {
+ "time": "12:55:00",
+ "value": 76
+ },
+ {
+ "time": "12:56:00",
+ "value": 71
+ },
+ {
+ "time": "12:57:00",
+ "value": 67
+ },
+ {
+ "time": "12:58:00",
+ "value": 65
+ },
+ {
+ "time": "12:59:00",
+ "value": 66
+ },
+ {
+ "time": "13:00:00",
+ "value": 66
+ },
+ {
+ "time": "13:01:00",
+ "value": 67
+ },
+ {
+ "time": "13:02:00",
+ "value": 68
+ },
+ {
+ "time": "13:03:00",
+ "value": 69
+ },
+ {
+ "time": "13:04:00",
+ "value": 75
+ },
+ {
+ "time": "13:05:00",
+ "value": 71
+ },
+ {
+ "time": "13:06:00",
+ "value": 70
+ },
+ {
+ "time": "13:07:00",
+ "value": 74
+ },
+ {
+ "time": "13:08:00",
+ "value": 72
+ },
+ {
+ "time": "13:09:00",
+ "value": 71
+ },
+ {
+ "time": "13:10:00",
+ "value": 72
+ },
+ {
+ "time": "13:11:00",
+ "value": 70
+ },
+ {
+ "time": "13:12:00",
+ "value": 69
+ },
+ {
+ "time": "13:13:00",
+ "value": 75
+ },
+ {
+ "time": "13:14:00",
+ "value": 76
+ },
+ {
+ "time": "13:15:00",
+ "value": 76
+ },
+ {
+ "time": "13:16:00",
+ "value": 80
+ },
+ {
+ "time": "13:17:00",
+ "value": 78
+ },
+ {
+ "time": "13:18:00",
+ "value": 80
+ },
+ {
+ "time": "13:19:00",
+ "value": 79
+ },
+ {
+ "time": "13:20:00",
+ "value": 79
+ },
+ {
+ "time": "13:21:00",
+ "value": 81
+ },
+ {
+ "time": "13:22:00",
+ "value": 80
+ },
+ {
+ "time": "13:23:00",
+ "value": 79
+ },
+ {
+ "time": "13:24:00",
+ "value": 80
+ },
+ {
+ "time": "13:25:00",
+ "value": 80
+ },
+ {
+ "time": "13:26:00",
+ "value": 79
+ },
+ {
+ "time": "13:27:00",
+ "value": 77
+ },
+ {
+ "time": "13:28:00",
+ "value": 72
+ },
+ {
+ "time": "13:29:00",
+ "value": 72
+ },
+ {
+ "time": "13:30:00",
+ "value": 71
+ },
+ {
+ "time": "13:31:00",
+ "value": 76
+ },
+ {
+ "time": "13:32:00",
+ "value": 83
+ },
+ {
+ "time": "13:33:00",
+ "value": 76
+ },
+ {
+ "time": "13:34:00",
+ "value": 73
+ },
+ {
+ "time": "13:35:00",
+ "value": 73
+ },
+ {
+ "time": "13:36:00",
+ "value": 75
+ },
+ {
+ "time": "13:37:00",
+ "value": 72
+ },
+ {
+ "time": "13:38:00",
+ "value": 71
+ },
+ {
+ "time": "13:39:00",
+ "value": 71
+ },
+ {
+ "time": "13:40:00",
+ "value": 74
+ },
+ {
+ "time": "13:41:00",
+ "value": 72
+ },
+ {
+ "time": "13:42:00",
+ "value": 73
+ },
+ {
+ "time": "13:43:00",
+ "value": 72
+ },
+ {
+ "time": "13:44:00",
+ "value": 70
+ },
+ {
+ "time": "13:45:00",
+ "value": 70
+ },
+ {
+ "time": "13:46:00",
+ "value": 71
+ },
+ {
+ "time": "13:47:00",
+ "value": 74
+ },
+ {
+ "time": "13:48:00",
+ "value": 72
+ },
+ {
+ "time": "13:49:00",
+ "value": 71
+ },
+ {
+ "time": "13:50:00",
+ "value": 71
+ },
+ {
+ "time": "13:51:00",
+ "value": 75
+ },
+ {
+ "time": "13:52:00",
+ "value": 75
+ },
+ {
+ "time": "13:53:00",
+ "value": 74
+ },
+ {
+ "time": "13:54:00",
+ "value": 82
+ },
+ {
+ "time": "13:55:00",
+ "value": 90
+ },
+ {
+ "time": "13:56:00",
+ "value": 94
+ },
+ {
+ "time": "13:57:00",
+ "value": 98
+ },
+ {
+ "time": "13:58:00",
+ "value": 102
+ },
+ {
+ "time": "14:00:00",
+ "value": 75
+ },
+ {
+ "time": "14:01:00",
+ "value": 68
+ },
+ {
+ "time": "14:02:00",
+ "value": 66
+ },
+ {
+ "time": "14:03:00",
+ "value": 64
+ },
+ {
+ "time": "14:04:00",
+ "value": 62
+ },
+ {
+ "time": "14:05:00",
+ "value": 63
+ },
+ {
+ "time": "14:06:00",
+ "value": 62
+ },
+ {
+ "time": "14:07:00",
+ "value": 63
+ },
+ {
+ "time": "14:08:00",
+ "value": 64
+ },
+ {
+ "time": "14:09:00",
+ "value": 64
+ },
+ {
+ "time": "14:10:00",
+ "value": 68
+ },
+ {
+ "time": "14:11:00",
+ "value": 72
+ },
+ {
+ "time": "14:12:00",
+ "value": 70
+ },
+ {
+ "time": "14:13:00",
+ "value": 66
+ },
+ {
+ "time": "14:14:00",
+ "value": 71
+ },
+ {
+ "time": "14:15:00",
+ "value": 71
+ },
+ {
+ "time": "14:16:00",
+ "value": 73
+ },
+ {
+ "time": "14:17:00",
+ "value": 72
+ },
+ {
+ "time": "14:18:00",
+ "value": 73
+ },
+ {
+ "time": "14:19:00",
+ "value": 73
+ },
+ {
+ "time": "14:20:00",
+ "value": 73
+ },
+ {
+ "time": "14:21:00",
+ "value": 74
+ },
+ {
+ "time": "14:22:00",
+ "value": 75
+ },
+ {
+ "time": "14:23:00",
+ "value": 75
+ },
+ {
+ "time": "14:24:00",
+ "value": 75
+ },
+ {
+ "time": "14:25:00",
+ "value": 74
+ },
+ {
+ "time": "14:26:00",
+ "value": 73
+ },
+ {
+ "time": "14:27:00",
+ "value": 71
+ },
+ {
+ "time": "14:28:00",
+ "value": 70
+ },
+ {
+ "time": "14:29:00",
+ "value": 75
+ },
+ {
+ "time": "14:30:00",
+ "value": 71
+ },
+ {
+ "time": "14:31:00",
+ "value": 63
+ },
+ {
+ "time": "14:32:00",
+ "value": 66
+ },
+ {
+ "time": "14:33:00",
+ "value": 69
+ },
+ {
+ "time": "14:34:00",
+ "value": 70
+ },
+ {
+ "time": "14:35:00",
+ "value": 72
+ },
+ {
+ "time": "14:36:00",
+ "value": 67
+ },
+ {
+ "time": "14:37:00",
+ "value": 65
+ },
+ {
+ "time": "14:38:00",
+ "value": 70
+ },
+ {
+ "time": "14:39:00",
+ "value": 72
+ },
+ {
+ "time": "14:40:00",
+ "value": 68
+ },
+ {
+ "time": "14:41:00",
+ "value": 65
+ },
+ {
+ "time": "14:42:00",
+ "value": 68
+ },
+ {
+ "time": "14:43:00",
+ "value": 74
+ },
+ {
+ "time": "14:44:00",
+ "value": 75
+ },
+ {
+ "time": "14:45:00",
+ "value": 75
+ },
+ {
+ "time": "14:46:00",
+ "value": 75
+ },
+ {
+ "time": "14:47:00",
+ "value": 80
+ },
+ {
+ "time": "14:48:00",
+ "value": 81
+ },
+ {
+ "time": "14:49:00",
+ "value": 74
+ },
+ {
+ "time": "14:50:00",
+ "value": 73
+ },
+ {
+ "time": "14:51:00",
+ "value": 73
+ },
+ {
+ "time": "14:52:00",
+ "value": 78
+ },
+ {
+ "time": "14:53:00",
+ "value": 70
+ },
+ {
+ "time": "14:54:00",
+ "value": 64
+ },
+ {
+ "time": "14:55:00",
+ "value": 67
+ },
+ {
+ "time": "14:56:00",
+ "value": 71
+ },
+ {
+ "time": "14:57:00",
+ "value": 71
+ },
+ {
+ "time": "14:58:00",
+ "value": 70
+ },
+ {
+ "time": "14:59:00",
+ "value": 70
+ },
+ {
+ "time": "15:00:00",
+ "value": 68
+ },
+ {
+ "time": "15:01:00",
+ "value": 67
+ },
+ {
+ "time": "15:02:00",
+ "value": 71
+ },
+ {
+ "time": "15:03:00",
+ "value": 71
+ },
+ {
+ "time": "15:04:00",
+ "value": 65
+ },
+ {
+ "time": "15:05:00",
+ "value": 63
+ },
+ {
+ "time": "15:06:00",
+ "value": 64
+ },
+ {
+ "time": "15:07:00",
+ "value": 63
+ },
+ {
+ "time": "15:08:00",
+ "value": 72
+ },
+ {
+ "time": "15:09:00",
+ "value": 73
+ },
+ {
+ "time": "15:10:00",
+ "value": 75
+ },
+ {
+ "time": "15:11:00",
+ "value": 71
+ },
+ {
+ "time": "15:12:00",
+ "value": 71
+ },
+ {
+ "time": "15:13:00",
+ "value": 75
+ },
+ {
+ "time": "15:14:00",
+ "value": 71
+ },
+ {
+ "time": "15:15:00",
+ "value": 71
+ },
+ {
+ "time": "15:16:00",
+ "value": 73
+ },
+ {
+ "time": "15:17:00",
+ "value": 74
+ },
+ {
+ "time": "15:18:00",
+ "value": 73
+ },
+ {
+ "time": "15:19:00",
+ "value": 73
+ },
+ {
+ "time": "15:20:00",
+ "value": 70
+ },
+ {
+ "time": "15:21:00",
+ "value": 69
+ },
+ {
+ "time": "15:22:00",
+ "value": 67
+ },
+ {
+ "time": "15:23:00",
+ "value": 68
+ },
+ {
+ "time": "15:24:00",
+ "value": 66
+ },
+ {
+ "time": "15:25:00",
+ "value": 63
+ },
+ {
+ "time": "15:26:00",
+ "value": 62
+ },
+ {
+ "time": "15:27:00",
+ "value": 63
+ },
+ {
+ "time": "15:28:00",
+ "value": 74
+ },
+ {
+ "time": "15:29:00",
+ "value": 73
+ },
+ {
+ "time": "15:30:00",
+ "value": 69
+ },
+ {
+ "time": "15:31:00",
+ "value": 70
+ },
+ {
+ "time": "15:32:00",
+ "value": 73
+ },
+ {
+ "time": "15:33:00",
+ "value": 73
+ },
+ {
+ "time": "15:34:00",
+ "value": 73
+ },
+ {
+ "time": "15:35:00",
+ "value": 75
+ },
+ {
+ "time": "15:36:00",
+ "value": 74
+ },
+ {
+ "time": "15:37:00",
+ "value": 73
+ },
+ {
+ "time": "15:38:00",
+ "value": 72
+ },
+ {
+ "time": "15:39:00",
+ "value": 74
+ },
+ {
+ "time": "15:40:00",
+ "value": 73
+ },
+ {
+ "time": "15:41:00",
+ "value": 73
+ },
+ {
+ "time": "15:42:00",
+ "value": 76
+ },
+ {
+ "time": "15:43:00",
+ "value": 77
+ },
+ {
+ "time": "15:44:00",
+ "value": 77
+ },
+ {
+ "time": "15:45:00",
+ "value": 77
+ },
+ {
+ "time": "15:46:00",
+ "value": 79
+ },
+ {
+ "time": "15:47:00",
+ "value": 73
+ },
+ {
+ "time": "15:48:00",
+ "value": 70
+ },
+ {
+ "time": "15:49:00",
+ "value": 68
+ },
+ {
+ "time": "15:50:00",
+ "value": 73
+ },
+ {
+ "time": "15:51:00",
+ "value": 72
+ },
+ {
+ "time": "15:52:00",
+ "value": 69
+ },
+ {
+ "time": "15:53:00",
+ "value": 69
+ },
+ {
+ "time": "15:54:00",
+ "value": 67
+ },
+ {
+ "time": "15:55:00",
+ "value": 66
+ },
+ {
+ "time": "15:56:00",
+ "value": 65
+ },
+ {
+ "time": "15:57:00",
+ "value": 64
+ },
+ {
+ "time": "15:58:00",
+ "value": 64
+ },
+ {
+ "time": "15:59:00",
+ "value": 67
+ },
+ {
+ "time": "16:00:00",
+ "value": 68
+ },
+ {
+ "time": "16:01:00",
+ "value": 69
+ },
+ {
+ "time": "16:02:00",
+ "value": 70
+ },
+ {
+ "time": "16:03:00",
+ "value": 71
+ },
+ {
+ "time": "16:04:00",
+ "value": 71
+ },
+ {
+ "time": "16:05:00",
+ "value": 67
+ },
+ {
+ "time": "16:06:00",
+ "value": 62
+ },
+ {
+ "time": "16:07:00",
+ "value": 61
+ },
+ {
+ "time": "16:08:00",
+ "value": 70
+ },
+ {
+ "time": "16:09:00",
+ "value": 74
+ },
+ {
+ "time": "16:10:00",
+ "value": 77
+ },
+ {
+ "time": "16:11:00",
+ "value": 74
+ },
+ {
+ "time": "16:12:00",
+ "value": 74
+ },
+ {
+ "time": "16:13:00",
+ "value": 72
+ },
+ {
+ "time": "16:14:00",
+ "value": 75
+ },
+ {
+ "time": "16:15:00",
+ "value": 77
+ },
+ {
+ "time": "16:16:00",
+ "value": 76
+ },
+ {
+ "time": "16:17:00",
+ "value": 75
+ },
+ {
+ "time": "16:18:00",
+ "value": 71
+ },
+ {
+ "time": "16:19:00",
+ "value": 72
+ },
+ {
+ "time": "16:20:00",
+ "value": 73
+ },
+ {
+ "time": "16:21:00",
+ "value": 66
+ },
+ {
+ "time": "16:22:00",
+ "value": 65
+ },
+ {
+ "time": "16:23:00",
+ "value": 63
+ },
+ {
+ "time": "16:24:00",
+ "value": 68
+ },
+ {
+ "time": "16:25:00",
+ "value": 72
+ },
+ {
+ "time": "16:26:00",
+ "value": 70
+ },
+ {
+ "time": "16:27:00",
+ "value": 64
+ },
+ {
+ "time": "16:28:00",
+ "value": 67
+ },
+ {
+ "time": "16:29:00",
+ "value": 72
+ },
+ {
+ "time": "16:30:00",
+ "value": 72
+ },
+ {
+ "time": "16:31:00",
+ "value": 70
+ },
+ {
+ "time": "16:32:00",
+ "value": 67
+ },
+ {
+ "time": "16:33:00",
+ "value": 69
+ },
+ {
+ "time": "16:34:00",
+ "value": 67
+ },
+ {
+ "time": "16:35:00",
+ "value": 67
+ },
+ {
+ "time": "16:36:00",
+ "value": 67
+ },
+ {
+ "time": "16:37:00",
+ "value": 70
+ },
+ {
+ "time": "16:38:00",
+ "value": 70
+ },
+ {
+ "time": "16:39:00",
+ "value": 72
+ },
+ {
+ "time": "16:40:00",
+ "value": 69
+ },
+ {
+ "time": "16:41:00",
+ "value": 70
+ },
+ {
+ "time": "16:42:00",
+ "value": 74
+ },
+ {
+ "time": "16:43:00",
+ "value": 74
+ },
+ {
+ "time": "16:44:00",
+ "value": 74
+ },
+ {
+ "time": "16:45:00",
+ "value": 71
+ },
+ {
+ "time": "16:46:00",
+ "value": 70
+ },
+ {
+ "time": "16:47:00",
+ "value": 71
+ },
+ {
+ "time": "16:48:00",
+ "value": 74
+ },
+ {
+ "time": "16:49:00",
+ "value": 74
+ },
+ {
+ "time": "16:50:00",
+ "value": 73
+ },
+ {
+ "time": "16:51:00",
+ "value": 74
+ },
+ {
+ "time": "16:52:00",
+ "value": 73
+ },
+ {
+ "time": "16:53:00",
+ "value": 70
+ },
+ {
+ "time": "16:54:00",
+ "value": 70
+ },
+ {
+ "time": "16:55:00",
+ "value": 70
+ },
+ {
+ "time": "16:56:00",
+ "value": 70
+ },
+ {
+ "time": "16:57:00",
+ "value": 74
+ },
+ {
+ "time": "16:58:00",
+ "value": 70
+ },
+ {
+ "time": "16:59:00",
+ "value": 67
+ },
+ {
+ "time": "17:00:00",
+ "value": 64
+ },
+ {
+ "time": "17:01:00",
+ "value": 60
+ },
+ {
+ "time": "17:02:00",
+ "value": 68
+ },
+ {
+ "time": "17:03:00",
+ "value": 70
+ },
+ {
+ "time": "17:04:00",
+ "value": 70
+ },
+ {
+ "time": "17:05:00",
+ "value": 69
+ },
+ {
+ "time": "17:06:00",
+ "value": 64
+ },
+ {
+ "time": "17:07:00",
+ "value": 63
+ },
+ {
+ "time": "17:08:00",
+ "value": 66
+ },
+ {
+ "time": "17:09:00",
+ "value": 66
+ },
+ {
+ "time": "17:10:00",
+ "value": 65
+ },
+ {
+ "time": "17:11:00",
+ "value": 68
+ },
+ {
+ "time": "17:12:00",
+ "value": 70
+ },
+ {
+ "time": "17:13:00",
+ "value": 70
+ },
+ {
+ "time": "17:14:00",
+ "value": 66
+ },
+ {
+ "time": "17:15:00",
+ "value": 66
+ },
+ {
+ "time": "17:16:00",
+ "value": 67
+ },
+ {
+ "time": "17:17:00",
+ "value": 71
+ },
+ {
+ "time": "17:18:00",
+ "value": 72
+ },
+ {
+ "time": "17:19:00",
+ "value": 71
+ },
+ {
+ "time": "17:20:00",
+ "value": 70
+ },
+ {
+ "time": "17:21:00",
+ "value": 69
+ },
+ {
+ "time": "17:22:00",
+ "value": 73
+ },
+ {
+ "time": "17:23:00",
+ "value": 68
+ },
+ {
+ "time": "17:24:00",
+ "value": 59
+ },
+ {
+ "time": "17:25:00",
+ "value": 63
+ },
+ {
+ "time": "17:26:00",
+ "value": 66
+ },
+ {
+ "time": "17:27:00",
+ "value": 71
+ },
+ {
+ "time": "17:28:00",
+ "value": 71
+ },
+ {
+ "time": "17:29:00",
+ "value": 71
+ },
+ {
+ "time": "17:30:00",
+ "value": 69
+ },
+ {
+ "time": "17:31:00",
+ "value": 68
+ },
+ {
+ "time": "17:32:00",
+ "value": 67
+ },
+ {
+ "time": "17:33:00",
+ "value": 70
+ },
+ {
+ "time": "17:34:00",
+ "value": 70
+ },
+ {
+ "time": "17:35:00",
+ "value": 68
+ },
+ {
+ "time": "17:36:00",
+ "value": 67
+ },
+ {
+ "time": "17:37:00",
+ "value": 70
+ },
+ {
+ "time": "17:38:00",
+ "value": 70
+ },
+ {
+ "time": "17:39:00",
+ "value": 69
+ },
+ {
+ "time": "17:40:00",
+ "value": 71
+ },
+ {
+ "time": "17:41:00",
+ "value": 70
+ },
+ {
+ "time": "17:42:00",
+ "value": 67
+ },
+ {
+ "time": "17:43:00",
+ "value": 70
+ },
+ {
+ "time": "17:44:00",
+ "value": 69
+ },
+ {
+ "time": "17:45:00",
+ "value": 69
+ },
+ {
+ "time": "17:46:00",
+ "value": 68
+ },
+ {
+ "time": "17:47:00",
+ "value": 67
+ },
+ {
+ "time": "17:48:00",
+ "value": 66
+ },
+ {
+ "time": "17:49:00",
+ "value": 63
+ },
+ {
+ "time": "17:50:00",
+ "value": 70
+ },
+ {
+ "time": "17:51:00",
+ "value": 71
+ },
+ {
+ "time": "17:52:00",
+ "value": 70
+ },
+ {
+ "time": "17:53:00",
+ "value": 69
+ },
+ {
+ "time": "17:54:00",
+ "value": 71
+ },
+ {
+ "time": "17:55:00",
+ "value": 72
+ },
+ {
+ "time": "17:56:00",
+ "value": 77
+ },
+ {
+ "time": "17:57:00",
+ "value": 72
+ },
+ {
+ "time": "17:58:00",
+ "value": 70
+ },
+ {
+ "time": "17:59:00",
+ "value": 73
+ },
+ {
+ "time": "18:00:00",
+ "value": 80
+ },
+ {
+ "time": "18:01:00",
+ "value": 81
+ },
+ {
+ "time": "18:02:00",
+ "value": 80
+ },
+ {
+ "time": "18:03:00",
+ "value": 84
+ },
+ {
+ "time": "18:04:00",
+ "value": 80
+ },
+ {
+ "time": "18:05:00",
+ "value": 77
+ },
+ {
+ "time": "18:06:00",
+ "value": 69
+ },
+ {
+ "time": "18:07:00",
+ "value": 67
+ },
+ {
+ "time": "18:08:00",
+ "value": 62
+ },
+ {
+ "time": "18:09:00",
+ "value": 64
+ },
+ {
+ "time": "18:10:00",
+ "value": 61
+ },
+ {
+ "time": "18:11:00",
+ "value": 61
+ },
+ {
+ "time": "18:12:00",
+ "value": 59
+ },
+ {
+ "time": "18:13:00",
+ "value": 62
+ },
+ {
+ "time": "18:14:00",
+ "value": 65
+ },
+ {
+ "time": "18:15:00",
+ "value": 67
+ },
+ {
+ "time": "18:16:00",
+ "value": 65
+ },
+ {
+ "time": "18:17:00",
+ "value": 62
+ },
+ {
+ "time": "18:18:00",
+ "value": 61
+ },
+ {
+ "time": "18:19:00",
+ "value": 60
+ },
+ {
+ "time": "18:20:00",
+ "value": 65
+ },
+ {
+ "time": "18:21:00",
+ "value": 63
+ },
+ {
+ "time": "18:22:00",
+ "value": 59
+ },
+ {
+ "time": "18:23:00",
+ "value": 65
+ },
+ {
+ "time": "18:24:00",
+ "value": 68
+ },
+ {
+ "time": "18:25:00",
+ "value": 64
+ },
+ {
+ "time": "18:26:00",
+ "value": 64
+ },
+ {
+ "time": "18:27:00",
+ "value": 67
+ },
+ {
+ "time": "18:28:00",
+ "value": 67
+ },
+ {
+ "time": "18:29:00",
+ "value": 68
+ },
+ {
+ "time": "18:30:00",
+ "value": 70
+ },
+ {
+ "time": "18:31:00",
+ "value": 68
+ },
+ {
+ "time": "18:32:00",
+ "value": 67
+ },
+ {
+ "time": "18:33:00",
+ "value": 67
+ },
+ {
+ "time": "18:34:00",
+ "value": 67
+ },
+ {
+ "time": "18:35:00",
+ "value": 68
+ },
+ {
+ "time": "18:36:00",
+ "value": 68
+ },
+ {
+ "time": "18:37:00",
+ "value": 67
+ },
+ {
+ "time": "18:38:00",
+ "value": 71
+ },
+ {
+ "time": "18:39:00",
+ "value": 72
+ },
+ {
+ "time": "18:40:00",
+ "value": 76
+ },
+ {
+ "time": "18:41:00",
+ "value": 79
+ },
+ {
+ "time": "18:42:00",
+ "value": 90
+ },
+ {
+ "time": "18:43:00",
+ "value": 101
+ },
+ {
+ "time": "18:44:00",
+ "value": 104
+ },
+ {
+ "time": "18:45:00",
+ "value": 99
+ },
+ {
+ "time": "18:46:00",
+ "value": 101
+ },
+ {
+ "time": "18:47:00",
+ "value": 108
+ },
+ {
+ "time": "18:48:00",
+ "value": 108
+ },
+ {
+ "time": "18:49:00",
+ "value": 109
+ },
+ {
+ "time": "18:50:00",
+ "value": 113
+ },
+ {
+ "time": "18:51:00",
+ "value": 112
+ },
+ {
+ "time": "18:52:00",
+ "value": 113
+ },
+ {
+ "time": "18:53:00",
+ "value": 108
+ },
+ {
+ "time": "18:54:00",
+ "value": 101
+ },
+ {
+ "time": "18:55:00",
+ "value": 87
+ },
+ {
+ "time": "18:56:00",
+ "value": 85
+ },
+ {
+ "time": "18:57:00",
+ "value": 84
+ },
+ {
+ "time": "18:58:00",
+ "value": 88
+ },
+ {
+ "time": "18:59:00",
+ "value": 92
+ },
+ {
+ "time": "19:00:00",
+ "value": 89
+ },
+ {
+ "time": "19:01:00",
+ "value": 86
+ },
+ {
+ "time": "19:02:00",
+ "value": 79
+ },
+ {
+ "time": "19:03:00",
+ "value": 67
+ },
+ {
+ "time": "19:04:00",
+ "value": 64
+ },
+ {
+ "time": "19:05:00",
+ "value": 66
+ },
+ {
+ "time": "19:06:00",
+ "value": 70
+ },
+ {
+ "time": "19:07:00",
+ "value": 70
+ },
+ {
+ "time": "19:08:00",
+ "value": 70
+ },
+ {
+ "time": "19:09:00",
+ "value": 70
+ },
+ {
+ "time": "19:10:00",
+ "value": 69
+ },
+ {
+ "time": "19:11:00",
+ "value": 70
+ },
+ {
+ "time": "19:12:00",
+ "value": 74
+ },
+ {
+ "time": "19:13:00",
+ "value": 64
+ },
+ {
+ "time": "19:14:00",
+ "value": 65
+ },
+ {
+ "time": "19:15:00",
+ "value": 67
+ },
+ {
+ "time": "19:16:00",
+ "value": 62
+ },
+ {
+ "time": "19:17:00",
+ "value": 62
+ },
+ {
+ "time": "19:18:00",
+ "value": 60
+ },
+ {
+ "time": "19:19:00",
+ "value": 61
+ },
+ {
+ "time": "19:20:00",
+ "value": 61
+ },
+ {
+ "time": "19:21:00",
+ "value": 63
+ },
+ {
+ "time": "19:22:00",
+ "value": 65
+ },
+ {
+ "time": "19:23:00",
+ "value": 61
+ },
+ {
+ "time": "19:24:00",
+ "value": 60
+ },
+ {
+ "time": "19:25:00",
+ "value": 61
+ },
+ {
+ "time": "19:26:00",
+ "value": 62
+ },
+ {
+ "time": "19:27:00",
+ "value": 62
+ },
+ {
+ "time": "19:28:00",
+ "value": 64
+ },
+ {
+ "time": "19:29:00",
+ "value": 62
+ },
+ {
+ "time": "19:30:00",
+ "value": 68
+ },
+ {
+ "time": "19:31:00",
+ "value": 64
+ },
+ {
+ "time": "19:32:00",
+ "value": 61
+ },
+ {
+ "time": "19:33:00",
+ "value": 63
+ },
+ {
+ "time": "19:34:00",
+ "value": 67
+ },
+ {
+ "time": "19:35:00",
+ "value": 65
+ },
+ {
+ "time": "19:36:00",
+ "value": 61
+ },
+ {
+ "time": "19:37:00",
+ "value": 62
+ },
+ {
+ "time": "19:38:00",
+ "value": 67
+ },
+ {
+ "time": "19:39:00",
+ "value": 68
+ },
+ {
+ "time": "19:40:00",
+ "value": 65
+ },
+ {
+ "time": "19:41:00",
+ "value": 65
+ },
+ {
+ "time": "19:42:00",
+ "value": 61
+ },
+ {
+ "time": "19:43:00",
+ "value": 61
+ },
+ {
+ "time": "19:44:00",
+ "value": 64
+ },
+ {
+ "time": "19:45:00",
+ "value": 60
+ },
+ {
+ "time": "19:46:00",
+ "value": 60
+ },
+ {
+ "time": "19:47:00",
+ "value": 61
+ },
+ {
+ "time": "19:48:00",
+ "value": 61
+ },
+ {
+ "time": "19:49:00",
+ "value": 63
+ },
+ {
+ "time": "19:50:00",
+ "value": 61
+ },
+ {
+ "time": "19:51:00",
+ "value": 59
+ },
+ {
+ "time": "19:52:00",
+ "value": 63
+ },
+ {
+ "time": "19:53:00",
+ "value": 62
+ },
+ {
+ "time": "19:54:00",
+ "value": 62
+ },
+ {
+ "time": "19:55:00",
+ "value": 62
+ },
+ {
+ "time": "19:56:00",
+ "value": 66
+ },
+ {
+ "time": "19:57:00",
+ "value": 65
+ },
+ {
+ "time": "19:58:00",
+ "value": 60
+ },
+ {
+ "time": "19:59:00",
+ "value": 63
+ },
+ {
+ "time": "20:00:00",
+ "value": 62
+ }
+ ],
+ "datasetInterval": 1,
+ "datasetType": "minute"
+ }
+}
\ No newline at end of file
diff --git a/Fitbit.Portable.Tests/SampleData/GetHeartRateIntradayTimeSeries1.1.json b/Fitbit.Portable.Tests/SampleData/GetHeartRateIntradayTimeSeries1.1.json
new file mode 100644
index 00000000..53e666ee
--- /dev/null
+++ b/Fitbit.Portable.Tests/SampleData/GetHeartRateIntradayTimeSeries1.1.json
@@ -0,0 +1,429 @@
+{
+ "activities-heart": [
+ {
+ "customHeartRateZones": [],
+ "dateTime": "2017-08-21",
+ "heartRateZones": [
+ {
+ "caloriesOut": 2071.96748,
+ "max": 92,
+ "min": 30,
+ "minutes": 1387,
+ "name": "Out of Range"
+ },
+ {
+ "caloriesOut": 140.76238,
+ "max": 128,
+ "min": 92,
+ "minutes": 19,
+ "name": "Fat Burn"
+ },
+ {
+ "caloriesOut": 36.27426,
+ "max": 156,
+ "min": 128,
+ "minutes": 3,
+ "name": "Cardio"
+ },
+ {
+ "caloriesOut": 186.84666,
+ "max": 220,
+ "min": 156,
+ "minutes": 14,
+ "name": "Peak"
+ }
+ ],
+ "value": "55.44"
+ }
+ ],
+ "activities-heart-intraday": {
+ "dataset": [
+ {
+ "time": "00:00:00",
+ "value": 57
+ },
+ {
+ "time": "00:15:00",
+ "value": 57
+ },
+ {
+ "time": "00:30:00",
+ "value": 55
+ },
+ {
+ "time": "00:45:00",
+ "value": 53
+ },
+ {
+ "time": "01:00:00",
+ "value": 50
+ },
+ {
+ "time": "01:15:00",
+ "value": 51
+ },
+ {
+ "time": "01:30:00",
+ "value": 54
+ },
+ {
+ "time": "01:45:00",
+ "value": 54
+ },
+ {
+ "time": "02:00:00",
+ "value": 54
+ },
+ {
+ "time": "02:15:00",
+ "value": 53
+ },
+ {
+ "time": "02:30:00",
+ "value": 51
+ },
+ {
+ "time": "02:45:00",
+ "value": 49
+ },
+ {
+ "time": "03:00:00",
+ "value": 51
+ },
+ {
+ "time": "03:15:00",
+ "value": 50
+ },
+ {
+ "time": "03:30:00",
+ "value": 50
+ },
+ {
+ "time": "03:45:00",
+ "value": 55
+ },
+ {
+ "time": "04:00:00",
+ "value": 53
+ },
+ {
+ "time": "04:15:00",
+ "value": 46
+ },
+ {
+ "time": "04:30:00",
+ "value": 45
+ },
+ {
+ "time": "04:45:00",
+ "value": 46
+ },
+ {
+ "time": "05:00:00",
+ "value": 47
+ },
+ {
+ "time": "05:15:00",
+ "value": 52
+ },
+ {
+ "time": "05:30:00",
+ "value": 52
+ },
+ {
+ "time": "05:45:00",
+ "value": 51
+ },
+ {
+ "time": "06:00:00",
+ "value": 47
+ },
+ {
+ "time": "06:15:00",
+ "value": 49
+ },
+ {
+ "time": "06:30:00",
+ "value": 46
+ },
+ {
+ "time": "06:45:00",
+ "value": 48
+ },
+ {
+ "time": "07:00:00",
+ "value": 53
+ },
+ {
+ "time": "07:15:00",
+ "value": 52
+ },
+ {
+ "time": "07:30:00",
+ "value": 53
+ },
+ {
+ "time": "07:45:00",
+ "value": 57
+ },
+ {
+ "time": "08:00:00",
+ "value": 57
+ },
+ {
+ "time": "08:15:00",
+ "value": 56
+ },
+ {
+ "time": "08:30:00",
+ "value": 91
+ },
+ {
+ "time": "08:45:00",
+ "value": 57
+ },
+ {
+ "time": "09:00:00",
+ "value": 57
+ },
+ {
+ "time": "09:15:00",
+ "value": 57
+ },
+ {
+ "time": "09:30:00",
+ "value": 55
+ },
+ {
+ "time": "09:45:00",
+ "value": 54
+ },
+ {
+ "time": "10:00:00",
+ "value": 54
+ },
+ {
+ "time": "10:15:00",
+ "value": 66
+ },
+ {
+ "time": "10:30:00",
+ "value": 61
+ },
+ {
+ "time": "10:45:00",
+ "value": 56
+ },
+ {
+ "time": "11:00:00",
+ "value": 56
+ },
+ {
+ "time": "11:15:00",
+ "value": 60
+ },
+ {
+ "time": "11:30:00",
+ "value": 58
+ },
+ {
+ "time": "11:45:00",
+ "value": 54
+ },
+ {
+ "time": "12:00:00",
+ "value": 58
+ },
+ {
+ "time": "12:15:00",
+ "value": 56
+ },
+ {
+ "time": "12:30:00",
+ "value": 49
+ },
+ {
+ "time": "12:45:00",
+ "value": 47
+ },
+ {
+ "time": "13:00:00",
+ "value": 51
+ },
+ {
+ "time": "13:15:00",
+ "value": 49
+ },
+ {
+ "time": "13:30:00",
+ "value": 79
+ },
+ {
+ "time": "13:45:00",
+ "value": 61
+ },
+ {
+ "time": "14:00:00",
+ "value": 54
+ },
+ {
+ "time": "14:15:00",
+ "value": 52
+ },
+ {
+ "time": "14:30:00",
+ "value": 53
+ },
+ {
+ "time": "14:45:00",
+ "value": 55
+ },
+ {
+ "time": "15:00:00",
+ "value": 56
+ },
+ {
+ "time": "15:15:00",
+ "value": 53
+ },
+ {
+ "time": "15:30:00",
+ "value": 56
+ },
+ {
+ "time": "15:45:00",
+ "value": 54
+ },
+ {
+ "time": "16:00:00",
+ "value": 55
+ },
+ {
+ "time": "16:15:00",
+ "value": 54
+ },
+ {
+ "time": "16:30:00",
+ "value": 52
+ },
+ {
+ "time": "16:45:00",
+ "value": 60
+ },
+ {
+ "time": "17:00:00",
+ "value": 52
+ },
+ {
+ "time": "17:15:00",
+ "value": 53
+ },
+ {
+ "time": "17:30:00",
+ "value": 52
+ },
+ {
+ "time": "17:45:00",
+ "value": 54
+ },
+ {
+ "time": "18:00:00",
+ "value": 52
+ },
+ {
+ "time": "18:15:00",
+ "value": 52
+ },
+ {
+ "time": "18:30:00",
+ "value": 56
+ },
+ {
+ "time": "18:45:00",
+ "value": 58
+ },
+ {
+ "time": "19:00:00",
+ "value": 66
+ },
+ {
+ "time": "19:15:00",
+ "value": 65
+ },
+ {
+ "time": "19:30:00",
+ "value": 61
+ },
+ {
+ "time": "19:45:00",
+ "value": 61
+ },
+ {
+ "time": "20:00:00",
+ "value": 56
+ },
+ {
+ "time": "20:15:00",
+ "value": 51
+ },
+ {
+ "time": "20:30:00",
+ "value": 51
+ },
+ {
+ "time": "20:45:00",
+ "value": 52
+ },
+ {
+ "time": "21:00:00",
+ "value": 55
+ },
+ {
+ "time": "21:15:00",
+ "value": 59
+ },
+ {
+ "time": "21:30:00",
+ "value": 138
+ },
+ {
+ "time": "21:45:00",
+ "value": 92
+ },
+ {
+ "time": "22:00:00",
+ "value": 49
+ },
+ {
+ "time": "22:15:00",
+ "value": 50
+ },
+ {
+ "time": "22:30:00",
+ "value": 49
+ },
+ {
+ "time": "22:45:00",
+ "value": 50
+ },
+ {
+ "time": "23:00:00",
+ "value": 51
+ },
+ {
+ "time": "23:15:00",
+ "value": 50
+ },
+ {
+ "time": "23:30:00",
+ "value": 46
+ },
+ {
+ "time": "23:45:00",
+ "value": 47
+ }
+ ],
+ "datasetInterval": 15,
+ "datasetType": "minute"
+ }
+}
\ No newline at end of file
diff --git a/Fitbit.Portable.Tests/SampleData/GetHeartRateTimeSeries.json b/Fitbit.Portable.Tests/SampleData/GetHeartRateTimeSeries.json
new file mode 100644
index 00000000..ec4cab90
--- /dev/null
+++ b/Fitbit.Portable.Tests/SampleData/GetHeartRateTimeSeries.json
@@ -0,0 +1,263 @@
+{
+ "activities-heart": [
+ {
+ "dateTime": "2017-08-15",
+ "value": {
+ "customHeartRateZones": [],
+ "heartRateZones": [
+ {
+ "caloriesOut": 2257.6846,
+ "max": 92,
+ "min": 30,
+ "minutes": 1264,
+ "name": "Out of Range"
+ },
+ {
+ "caloriesOut": 275.189,
+ "max": 128,
+ "min": 92,
+ "minutes": 38,
+ "name": "Fat Burn"
+ },
+ {
+ "caloriesOut": 505.5534,
+ "max": 156,
+ "min": 128,
+ "minutes": 43,
+ "name": "Cardio"
+ },
+ {
+ "caloriesOut": 287.33136,
+ "max": 220,
+ "min": 156,
+ "minutes": 21,
+ "name": "Peak"
+ }
+ ],
+ "restingHeartRate": 51
+ }
+ },
+ {
+ "dateTime": "2017-08-16",
+ "value": {
+ "customHeartRateZones": [],
+ "heartRateZones": [
+ {
+ "caloriesOut": 2187.85699,
+ "max": 92,
+ "min": 30,
+ "minutes": 1315,
+ "name": "Out of Range"
+ },
+ {
+ "caloriesOut": 150.84752,
+ "max": 128,
+ "min": 92,
+ "minutes": 22,
+ "name": "Fat Burn"
+ },
+ {
+ "caloriesOut": 992.09506,
+ "max": 156,
+ "min": 128,
+ "minutes": 82,
+ "name": "Cardio"
+ },
+ {
+ "caloriesOut": 0,
+ "max": 220,
+ "min": 156,
+ "minutes": 0,
+ "name": "Peak"
+ }
+ ],
+ "restingHeartRate": 51
+ }
+ },
+ {
+ "dateTime": "2017-08-17",
+ "value": {
+ "customHeartRateZones": [],
+ "heartRateZones": [
+ {
+ "caloriesOut": 2192.7144,
+ "max": 92,
+ "min": 30,
+ "minutes": 1422,
+ "name": "Out of Range"
+ },
+ {
+ "caloriesOut": 81.8856,
+ "max": 128,
+ "min": 92,
+ "minutes": 11,
+ "name": "Fat Burn"
+ },
+ {
+ "caloriesOut": 0,
+ "max": 156,
+ "min": 128,
+ "minutes": 0,
+ "name": "Cardio"
+ },
+ {
+ "caloriesOut": 0,
+ "max": 220,
+ "min": 156,
+ "minutes": 0,
+ "name": "Peak"
+ }
+ ],
+ "restingHeartRate": 53
+ }
+ },
+ {
+ "dateTime": "2017-08-18",
+ "value": {
+ "customHeartRateZones": [],
+ "heartRateZones": [
+ {
+ "caloriesOut": 2040.97476,
+ "max": 92,
+ "min": 30,
+ "minutes": 1273,
+ "name": "Out of Range"
+ },
+ {
+ "caloriesOut": 360.48711,
+ "max": 128,
+ "min": 92,
+ "minutes": 53,
+ "name": "Fat Burn"
+ },
+ {
+ "caloriesOut": 317.86233,
+ "max": 156,
+ "min": 128,
+ "minutes": 26,
+ "name": "Cardio"
+ },
+ {
+ "caloriesOut": 500.89815,
+ "max": 220,
+ "min": 156,
+ "minutes": 35,
+ "name": "Peak"
+ }
+ ],
+ "restingHeartRate": 51
+ }
+ },
+ {
+ "dateTime": "2017-08-19",
+ "value": {
+ "customHeartRateZones": [],
+ "heartRateZones": [
+ {
+ "caloriesOut": 2609.33728,
+ "max": 92,
+ "min": 30,
+ "minutes": 1321,
+ "name": "Out of Range"
+ },
+ {
+ "caloriesOut": 649.72589,
+ "max": 128,
+ "min": 92,
+ "minutes": 91,
+ "name": "Fat Burn"
+ },
+ {
+ "caloriesOut": 10.43372,
+ "max": 156,
+ "min": 128,
+ "minutes": 1,
+ "name": "Cardio"
+ },
+ {
+ "caloriesOut": 0,
+ "max": 220,
+ "min": 156,
+ "minutes": 0,
+ "name": "Peak"
+ }
+ ],
+ "restingHeartRate": 51
+ }
+ },
+ {
+ "dateTime": "2017-08-20",
+ "value": {
+ "customHeartRateZones": [],
+ "heartRateZones": [
+ {
+ "caloriesOut": 2015.24532,
+ "max": 92,
+ "min": 30,
+ "minutes": 1319,
+ "name": "Out of Range"
+ },
+ {
+ "caloriesOut": 102.59348,
+ "max": 128,
+ "min": 92,
+ "minutes": 14,
+ "name": "Fat Burn"
+ },
+ {
+ "caloriesOut": 0,
+ "max": 156,
+ "min": 128,
+ "minutes": 0,
+ "name": "Cardio"
+ },
+ {
+ "caloriesOut": 0,
+ "max": 220,
+ "min": 156,
+ "minutes": 0,
+ "name": "Peak"
+ }
+ ],
+ "restingHeartRate": 49
+ }
+ },
+ {
+ "dateTime": "2017-08-21",
+ "value": {
+ "customHeartRateZones": [],
+ "heartRateZones": [
+ {
+ "caloriesOut": 2071.96748,
+ "max": 92,
+ "min": 30,
+ "minutes": 1387,
+ "name": "Out of Range"
+ },
+ {
+ "caloriesOut": 140.76238,
+ "max": 128,
+ "min": 92,
+ "minutes": 19,
+ "name": "Fat Burn"
+ },
+ {
+ "caloriesOut": 36.27426,
+ "max": 156,
+ "min": 128,
+ "minutes": 3,
+ "name": "Cardio"
+ },
+ {
+ "caloriesOut": 186.84666,
+ "max": 220,
+ "min": 156,
+ "minutes": 14,
+ "name": "Peak"
+ }
+ ],
+ "restingHeartRate": 51
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Fitbit.Portable.Tests/SampleDataHelper.cs b/Fitbit.Portable.Tests/SampleDataHelper.cs
index 950e84e4..60346623 100644
--- a/Fitbit.Portable.Tests/SampleDataHelper.cs
+++ b/Fitbit.Portable.Tests/SampleDataHelper.cs
@@ -2,6 +2,11 @@
namespace Fitbit.Portable.Tests
{
+ ///
+ /// In order for this class to work with SampleData/Json files, the file must be available in bin/debug/SampleData.
+ /// To do this, go to the properties of the needed file and change "Copy To Output Directory" to "Copy If Newer"
+ /// If this is not done, this class will throw an error.
+ ///
public static class SampleDataHelper
{
private static readonly string SampleDataPath = Path.Combine(Path.GetDirectoryName(typeof(SampleDataHelper).Assembly.Location), "SampleData");
diff --git a/Fitbit.Portable.Tests/SleepTests.cs b/Fitbit.Portable.Tests/SleepTests.cs
index 249156e5..8ad373d6 100644
--- a/Fitbit.Portable.Tests/SleepTests.cs
+++ b/Fitbit.Portable.Tests/SleepTests.cs
@@ -79,7 +79,7 @@ public void GetUserProfileAsync_Failure_Errors()
Func> result = () => fitbitClient.GetSleepAsync(new DateTime(2014, 11, 11));
- result.ShouldThrow();
+ result.Should().Throw();
}
[Test]
diff --git a/Fitbit.Portable.Tests/SubscriptionManagerTests.cs b/Fitbit.Portable.Tests/SubscriptionManagerTests.cs
index abcaed90..49fdf280 100644
--- a/Fitbit.Portable.Tests/SubscriptionManagerTests.cs
+++ b/Fitbit.Portable.Tests/SubscriptionManagerTests.cs
@@ -39,7 +39,7 @@ public void Can_Process_Single_Request()
Assert.AreEqual(Expected_ownerId, result.OwnerId);
Assert.AreEqual(Expected_subId, result.SubscriptionId);
- Assert.AreEqual(APICollectionType.foods, result.CollectionType);
+ Assert.AreEqual(APICollectionType.activities, result.CollectionType);
Assert.AreEqual(ResourceOwnerType.User, result.OwnerType);
Assert.AreEqual(Expected_Date, result.Date);
diff --git a/Fitbit.Portable.Tests/UserProfileTests.cs b/Fitbit.Portable.Tests/UserProfileTests.cs
index 5ab87cdd..0e9f2137 100644
--- a/Fitbit.Portable.Tests/UserProfileTests.cs
+++ b/Fitbit.Portable.Tests/UserProfileTests.cs
@@ -50,7 +50,7 @@ public void GetUserProfileAsync_Failure_Errors()
Func>> result = () => fitbitClient.GetFriendsAsync();
- result.ShouldThrow();
+ result.Should().Throw();
}
[Test] [Category("Portable")]
diff --git a/Fitbit.Portable.Tests/WaterTests.cs b/Fitbit.Portable.Tests/WaterTests.cs
index 01e47762..d04b21a3 100644
--- a/Fitbit.Portable.Tests/WaterTests.cs
+++ b/Fitbit.Portable.Tests/WaterTests.cs
@@ -50,7 +50,7 @@ public void GetWaterAsync_Errors()
Func> result = () => fitbitClient.GetFoodAsync(new DateTime(2015, 1, 12));
- result.ShouldThrow();
+ result.Should().Throw();
}
[Test] [Category("Portable")]
diff --git a/Fitbit.Portable.Tests/WeightTests.cs b/Fitbit.Portable.Tests/WeightTests.cs
index 4692e212..90340ae6 100644
--- a/Fitbit.Portable.Tests/WeightTests.cs
+++ b/Fitbit.Portable.Tests/WeightTests.cs
@@ -6,7 +6,7 @@
using Fitbit.Api.Portable;
using Fitbit.Models;
using NUnit.Framework;
-using Ploeh.AutoFixture;
+using AutoFixture;
using System.Threading.Tasks;
namespace Fitbit.Portable.Tests
@@ -16,7 +16,7 @@ public class WeightTests
{
public Fixture fixture { get; set; }
- [TestFixtureSetUp]
+ [OneTimeSetUp]
public void Init()
{
fixture = new Fixture();
diff --git a/Fitbit.Portable.Tests/app.config b/Fitbit.Portable.Tests/app.config
index 1c087674..77d61e50 100644
--- a/Fitbit.Portable.Tests/app.config
+++ b/Fitbit.Portable.Tests/app.config
@@ -1,19 +1,19 @@
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
\ No newline at end of file
+
diff --git a/Fitbit.Portable.Tests/packages.config b/Fitbit.Portable.Tests/packages.config
deleted file mode 100644
index 6378805d..00000000
--- a/Fitbit.Portable.Tests/packages.config
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/Fitbit.Portable/Fitbit.Portable.csproj b/Fitbit.Portable/Fitbit.Portable.csproj
index f1688c90..970c5b1d 100644
--- a/Fitbit.Portable/Fitbit.Portable.csproj
+++ b/Fitbit.Portable/Fitbit.Portable.csproj
@@ -1,201 +1,29 @@
-
-
-
+
+
- 10.0
- Debug
- AnyCPU
- {1358D3B4-0698-4003-97EB-B6D489E04138}
- Library
- Properties
- Fitbit.Api.Portable
- Fitbit.Portable
- en-US
- 512
- {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
- Profile344
- v4.0
- ..\Fitbit\
-
-
+ netstandard1.3;netstandard2.0
+ Fitbit.NET
+ Fitbit.NET
+ Copyright © 2018
+ 3.0.0
+ Fitbit
+ Fitbit
+ Fitbit.Net contributors Team -- @aarondcoleman, @WestDiscGolf, @mxa0079, @joshFitabase
+ Fitbit API client for .NET
+ https://github.com/aarondcoleman/Fitbit.NET
+ https://github.com/aarondcoleman/Fitbit.NET
+ http://static3.fitbit.com/simple.b-dis-png.h76d53d8e6a0653b38326a825b2b9cf57.pack?items=/images/common/bg_branding_b.png
+ Fitbit OAuth2 API .NET IoT Wearables
+ 1.0.0.0
+ true
-
- true
- full
- false
- bin\Debug\
- TRACE;DEBUG;REQUIRES_JSONNET
- prompt
- 4
+
+
+ TRACE;NETSTANDARD1_3
-
- pdbonly
- true
- bin\Release\
- TRACE;REQUIRES_JSONNET
- prompt
- 4
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ..\Fitbit\packages\Microsoft.Bcl.Async.1.0.168\lib\portable-net40+sl4+win8+wp71+wpa81\Microsoft.Threading.Tasks.dll
-
-
- ..\Fitbit\packages\Microsoft.Bcl.Async.1.0.168\lib\portable-net40+sl4+win8+wp71+wpa81\Microsoft.Threading.Tasks.Extensions.dll
-
-
- ..\Fitbit\packages\Newtonsoft.Json.8.0.2\lib\portable-net40+sl5+wp80+win8+wpa81\Newtonsoft.Json.dll
- True
-
-
- ..\Fitbit\packages\Microsoft.Bcl.1.1.10\lib\portable-net40+sl5+win8+wp8+wpa81\System.IO.dll
-
-
- ..\Fitbit\packages\Microsoft.Net.Http.2.2.29\lib\portable-net40+sl4+win8+wp71+wpa81\System.Net.Http.dll
-
-
- ..\Fitbit\packages\Microsoft.Net.Http.2.2.29\lib\portable-net40+sl4+win8+wp71+wpa81\System.Net.Http.Extensions.dll
-
-
- ..\Fitbit\packages\Microsoft.Net.Http.2.2.29\lib\portable-net40+sl4+win8+wp71+wpa81\System.Net.Http.Primitives.dll
-
-
- ..\Fitbit\packages\Microsoft.Bcl.1.1.10\lib\portable-net40+sl5+win8+wp8+wpa81\System.Runtime.dll
-
-
- ..\Fitbit\packages\Microsoft.Bcl.1.1.10\lib\portable-net40+sl5+win8+wp8+wpa81\System.Threading.Tasks.dll
-
-
+
-
-
+
-
-
-
-
- This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
-
-
-
-
-
\ No newline at end of file
+
+
diff --git a/Fitbit.Portable/FitbitClient.cs b/Fitbit.Portable/FitbitClient.cs
index 2ca91a5f..4fee7f67 100644
--- a/Fitbit.Portable/FitbitClient.cs
+++ b/Fitbit.Portable/FitbitClient.cs
@@ -8,6 +8,7 @@
using System.Net.Http.Headers;
using Fitbit.Api.Portable.Models;
using Fitbit.Models;
+using Newtonsoft.Json;
namespace Fitbit.Api.Portable
{
@@ -56,7 +57,7 @@ public FitbitClient(FitbitAppCredentials credentials, OAuth2AccessToken accessTo
this.FitbitInterceptorPipeline = new List();
- if(interceptor != null)
+ if (interceptor != null)
{
this.FitbitInterceptorPipeline.Add(interceptor);
}
@@ -72,7 +73,7 @@ public FitbitClient(FitbitAppCredentials credentials, OAuth2AccessToken accessTo
private void ConfigureAutoRefresh(bool enableOAuth2TokenRefresh)
{
this.OAuth2TokenAutoRefresh = enableOAuth2TokenRefresh;
- if(OAuth2TokenAutoRefresh)
+ if (OAuth2TokenAutoRefresh)
this.FitbitInterceptorPipeline.Add(new OAuth2AutoRefreshInterceptor());
return;
}
@@ -83,14 +84,14 @@ private void ConfigureAutoRefresh(bool enableOAuth2TokenRefresh)
/// Obtain this information from your developer dashboard. App credentials are required to perform token refresh
/// Authenticate with Fitbit API using OAuth2. Authenticator2 class is a helper for this process
/// An interface that enables sniffing all outgoing and incoming http requests from FitbitClient
- public FitbitClient(FitbitAppCredentials credentials, OAuth2AccessToken accessToken, List interceptors, bool enableOAuth2TokenRefresh = true, ITokenManager tokenManager = null)
+ public FitbitClient(FitbitAppCredentials credentials, OAuth2AccessToken accessToken, List interceptors, bool enableOAuth2TokenRefresh = true, ITokenManager tokenManager = null)
{
this.AppCredentials = credentials;
this.AccessToken = accessToken;
this.FitbitInterceptorPipeline = new List();
- if(interceptors != null && interceptors.Count > 0)
+ if (interceptors != null && interceptors.Count > 0)
this.FitbitInterceptorPipeline.AddRange(interceptors);
ConfigureTokenManager(tokenManager);
@@ -161,7 +162,7 @@ public async Task RefreshOAuth2TokenAsync()
AccessToken = await TokenManager.RefreshTokenAsync(this);
return AccessToken;
}
-
+
///
/// Requests the activity details of the encoded user id or if none supplied the current logged in user for the specified date
///
@@ -191,7 +192,7 @@ public async Task GetDayActivitySummaryAsync(DateTime activityD
HttpResponseMessage response = await HttpClient.GetAsync(apiCall);
await HandleResponse(response);
string responseBody = await response.Content.ReadAsStringAsync();
- var serializer = new JsonDotNetSerializer {RootProperty = "summary"};
+ var serializer = new JsonDotNetSerializer { RootProperty = "summary" };
return serializer.Deserialize(responseBody);
}
@@ -202,7 +203,7 @@ public async Task GetDayActivitySummaryAsync(DateTime activityD
///
public async Task GetActivitiesStatsAsync(string encodedUserId = null)
{
- string apiCall = FitbitClientHelperExtensions.ToFullUrl("/1/user/{0}/activities.json", encodedUserId);
+ string apiCall = FitbitClientHelperExtensions.ToFullUrl("/1/user/{0}/activities.json", encodedUserId);
HttpResponseMessage response = await HttpClient.GetAsync(apiCall);
await HandleResponse(response);
string responseBody = await response.Content.ReadAsStringAsync();
@@ -210,8 +211,6 @@ public async Task GetActivitiesStatsAsync(string encodedUserId
return serializer.Deserialize(responseBody);
}
- #region Sleep
-
///
/// Requests the sleep data for the specified date for the logged in user
/// NOTE: This is for the V1 of the sleep api which is now Deprecated
@@ -246,7 +245,7 @@ public async Task GetSleepDateAsync(DateTime sleepDate, string
string responseBody = await response.Content.ReadAsStringAsync();
var serializer = new JsonDotNetSerializer();
var data = serializer.Deserialize(responseBody);
-
+
return data;
}
@@ -269,8 +268,7 @@ public async Task GetSleepDateRangeAsync(DateTime startDate,
return data;
}
-
-
+
///
/// The Get Sleep Logs List endpoint returns a list of a user's sleep logs (including naps)
/// before or after a given day with offset, limit, and sort order.
@@ -285,41 +283,41 @@ public async Task GetSleepLogListAsync(DateTime dateToList, Sl
string encodedUserId = null)
{
string setSleepDecision, setSort;
-
+
//decide if date retrieval is before or after
switch (decisionDate)
{
- case SleepEnum.After:
- setSleepDecision = "afterDate";
- break;
- case SleepEnum.Before:
- setSleepDecision = "beforeDate";
- break;
- default:
+ case SleepEnum.After:
+ setSleepDecision = "afterDate";
+ break;
+ case SleepEnum.Before:
+ setSleepDecision = "beforeDate";
+ break;
+ default:
//in case of some sort of error we will set our date to before
- setSleepDecision = "beforeDate";
+ setSleepDecision = "beforeDate";
break;
}
//decide if we are sorting asc or dsc
switch (sort)
{
- case SortEnum.Asc:
- setSort = "asc";
+ case SortEnum.Asc:
+ setSort = "asc";
+ break;
+
+ case SortEnum.Dsc:
+ setSort = "desc";
break;
-
- case SortEnum.Dsc:
- setSort = "desc";
- break;
default:
//in case of some sort of error we will set our sort to asc
setSort = "asc";
break;
}
-
- var apiCall = FitbitClientHelperExtensions.ToFullUrl("/1.2/user/{0}/sleep/list.json?{1}={2}&sort={3}&offset=0&limit={4}",
+
+ var apiCall = FitbitClientHelperExtensions.ToFullUrl("/1.2/user/{0}/sleep/list.json?{1}={2}&sort={3}&offset=0&limit={4}",
encodedUserId, setSleepDecision, dateToList.ToFitbitFormat(), setSort, limit);
-
+
HttpResponseMessage respone = await HttpClient.GetAsync(apiCall);
await HandleResponse(respone);
string responseBody = await respone.Content.ReadAsStringAsync();
@@ -340,7 +338,7 @@ public async Task GetSleepLogListAsync(DateTime dateToList, Sl
///
public async Task PostLogSleepAsync(string startTime, int duration, DateTime date, string encodedUserId = null)
{
-
+
var apiCall =
FitbitClientHelperExtensions.ToFullUrl("/1.2/user/{0}/sleep.json?date={1}&startTime={2}&duration={3}",
encodedUserId, date.ToFitbitFormat(), startTime, duration);
@@ -349,12 +347,10 @@ public async Task PostLogSleepAsync(string startTime, int dur
await HandleResponse(respone);
string responeBody = await respone.Content.ReadAsStringAsync();
var serialzer = new JsonDotNetSerializer();
-
+
return serialzer.Deserialize(responeBody);
}
- #endregion Sleep
-
///
/// Requests the devices for the current logged in user
///
@@ -386,61 +382,61 @@ public async Task> GetDevicesAsync()
return serializer.GetFriends(responseBody);
}
- ///
- /// Request to get heart rate in specific in a range time
- ///
- ///
- ///
- ///
- ///
- public async Task GetHeartRateTimeSeries(DateTime date, DateRangePeriod dateRangePeriod, string userId = null)
- {
- if (string.IsNullOrWhiteSpace(userId))
- {
- userId = "-";
- }
-
- string apiCall = String.Format("https://api.fitbit.com/1.1/user/{0}/activities/heart/date/{1}/{2}.json", userId, date.ToString("yyyy-MM-dd"), dateRangePeriod.GetStringValue());
+ /////
+ ///// Request to get heart rate in specific in a range time
+ /////
+ /////
+ /////
+ /////
+ /////
+ //public async Task GetHeartRateTimeSeries(DateTime date, DateRangePeriod dateRangePeriod, string userId = null)
+ //{
+ // if (string.IsNullOrWhiteSpace(userId))
+ // {
+ // userId = "-";
+ // }
+
+ // string apiCall = String.Format("https://api.fitbit.com/1.1/user/{0}/activities/heart/date/{1}/{2}.json", userId, date.ToString("yyyy-MM-dd"), dateRangePeriod.GetStringValue());
- HttpResponseMessage response = await HttpClient.GetAsync(apiCall);
- await HandleResponse(response);
-
- string responseBody = await response.Content.ReadAsStringAsync();
- var seralizer = new JsonDotNetSerializer();
-
- var fitbitResponse = seralizer.GetHeartActivitiesTimeSeries(responseBody);
-
- return fitbitResponse;
- }
-
- ///
- /// Request to get heart rate in a day
- ///
- ///
- ///
- ///
- public async Task GetHeartRateIntraday(DateTime date, HeartRateResolution resolution)
- {
- string resolutionText = null;
-
- //this little big of section is necessary because enums can't start with numbers
- if (resolution == HeartRateResolution.oneSecond)
- resolutionText = "1sec";
- else if (resolution == HeartRateResolution.oneMinute)
- resolutionText = "1min";
- else
- resolutionText = "15min";
-
- string apiCall = String.Format("https://api.fitbit.com/1.1/user/-/activities/heart/date/{0}/{1}/{2}/time/00:00:00/23:59:59.json", date.ToString("yyyy-MM-dd"), date.ToString("yyyy-MM-dd"), resolutionText);
+ // HttpResponseMessage response = await HttpClient.GetAsync(apiCall);
+ // await HandleResponse(response);
+
+ // string responseBody = await response.Content.ReadAsStringAsync();
+ // var seralizer = new JsonDotNetSerializer();
+
+ // var fitbitResponse = seralizer.GetHeartActivitiesTimeSeries(responseBody);
+
+ // return fitbitResponse;
+ //}
+
+ /////
+ ///// Request to get heart rate in a day
+ /////
+ /////
+ /////
+ /////
+ //public async Task GetHeartRateIntraday(DateTime date, HeartRateResolution resolution)
+ //{
+ // string resolutionText = null;
+
+ // //this little big of section is necessary because enums can't start with numbers
+ // if (resolution == HeartRateResolution.oneSecond)
+ // resolutionText = "1sec";
+ // else if (resolution == HeartRateResolution.oneMinute)
+ // resolutionText = "1min";
+ // else
+ // resolutionText = "15min";
+
+ // string apiCall = String.Format("https://api.fitbit.com/1.1/user/-/activities/heart/date/{0}/{1}/{2}/time/00:00:00/23:59:59.json", date.ToString("yyyy-MM-dd"), date.ToString("yyyy-MM-dd"), resolutionText);
- HttpResponseMessage response = await HttpClient.GetAsync(apiCall);
- await HandleResponse(response);
+ // HttpResponseMessage response = await HttpClient.GetAsync(apiCall);
+ // await HandleResponse(response);
- string responseBody = await response.Content.ReadAsStringAsync();
- var seralizer = new JsonDotNetSerializer();
+ // string responseBody = await response.Content.ReadAsStringAsync();
+ // var seralizer = new JsonDotNetSerializer();
- return seralizer.GetHeartRateIntraday(date, responseBody);
- }
+ // return seralizer.GetHeartRateIntraday(date, responseBody);
+ //}
///
/// Requests the user profile of the encoded user id or if none specified the current logged in user
@@ -455,7 +451,7 @@ public async Task GetHeartRateIntraday(DateTime date, H
await HandleResponse(response);
string responseBody = await response.Content.ReadAsStringAsync();
var serializer = new JsonDotNetSerializer { RootProperty = "user" };
- return serializer.Deserialize(responseBody);
+ return serializer.Deserialize(responseBody);
}
///
@@ -500,8 +496,8 @@ public async Task GetHeartRateIntraday(DateTime date, H
await HandleResponse(response);
string responseBody = await response.Content.ReadAsStringAsync();
- var serializer = new JsonDotNetSerializer {RootProperty = timeSeriesResourceType.ToTimeSeriesProperty()};
- return serializer.GetTimeSeriesDataList(responseBody);
+ var serializer = new JsonDotNetSerializer { RootProperty = timeSeriesResourceType.ToTimeSeriesProperty() };
+ return serializer.GetTimeSeriesDataList(responseBody);
}
@@ -592,7 +588,7 @@ public async Task GetIntraDayTimeSeriesAsync(IntradayResourceType
await HandleResponse(response);
string responseBody = await response.Content.ReadAsStringAsync();
- if(string.IsNullOrWhiteSpace(responseBody))
+ if (string.IsNullOrWhiteSpace(responseBody))
{
throw new FitbitRequestException(response, null, "The Intraday data response body was null");
}
@@ -605,10 +601,10 @@ public async Task GetIntraDayTimeSeriesAsync(IntradayResourceType
{
data = serializer.GetIntradayTimeSeriesData(responseBody);
}
- catch(Exception ex)
+ catch (Exception ex)
{
FitbitRequestException fEx = new FitbitRequestException(response, null, "Serialization Error in GetIntradayTimeSeriesData", ex);
- throw fEx;
+ throw fEx;
}
return data;
@@ -830,14 +826,14 @@ public async Task GetWeightAsync(DateTime startDate, DateTime? endDate =
{
messageContentParameters.Add("activeMinutes", activeMinutes.ToString());
}
-
+
var apiCall = FitbitClientHelperExtensions.ToFullUrl("/1/user/-/activities/goals/daily.json");
//caloriesOut=100&distance=1.0&floors=1&steps=8000&activeMinutes=10
HttpResponseMessage response = await HttpClient.PostAsync(apiCall, new FormUrlEncodedContent(messageContentParameters));
await HandleResponse(response);
string responseBody = await response.Content.ReadAsStringAsync();
- var seralizer = new JsonDotNetSerializer {RootProperty = "goals"};
+ var seralizer = new JsonDotNetSerializer { RootProperty = "goals" };
return seralizer.Deserialize(responseBody);
}
@@ -924,10 +920,10 @@ public async Task> GetSubscriptionsAsync()
string resource = FormatKey(apiCollectionType, Constants.Formatting.LeadingDash);
string url = "/1/user/-/{1}apiSubscriptions/{3}{2}.json";
- string apiCall = FitbitClientHelperExtensions.ToFullUrl(url, args: new object[] {path, resource, uniqueSubscriptionId});
+ string apiCall = FitbitClientHelperExtensions.ToFullUrl(url, args: new object[] { path, resource, uniqueSubscriptionId });
if (!string.IsNullOrWhiteSpace(subscriberId))
{
- HttpClient.DefaultRequestHeaders.Add(Constants.Headers.XFitbitSubscriberId, subscriberId);
+ HttpClient.DefaultRequestHeaders.Add(Constants.Headers.XFitbitSubscriberId, subscriberId);
}
HttpResponseMessage response = await HttpClient.PostAsync(apiCall, new StringContent(string.Empty));
@@ -937,7 +933,6 @@ public async Task> GetSubscriptionsAsync()
return serializer.Deserialize(responseBody);
}
-
public async Task DeleteSubscriptionAsync(APICollectionType collection, string uniqueSubscriptionId, string subscriberId = null)
{
var collectionString = string.Empty;
@@ -964,6 +959,183 @@ public async Task DeleteSubscriptionAsync(APICollectionType collection, string u
}
}
+ ///
+ /// Logs the specified Activity item for the current logged in user - https://dev.fitbit.com/docs/activity/#activity-logging
+ ///
+ ///
+ /// ActivityLog
+ public async Task LogActivityAsync(ActivityLog model)
+ {
+ string apiCall = FitbitClientHelperExtensions.ToFullUrl("/1/user/-/activities.json");
+
+ var items = new Dictionary
+ {
+ {"activityName", Uri.EscapeDataString(model.Name)},
+ {"manualCalories", model.Calories.ToString()},
+ {"startTime", model.StartTime},
+ {"durationMillis", model.Duration.ToString()},
+ {"date", model.Date},
+ {"distance", model.Distance.ToString()}
+ };
+
+ if (!string.IsNullOrEmpty(model.ActivityId.ToString()) && model.ActivityId != 0)
+ {
+ items.Add("activityId", model.ActivityId.ToString());
+ }
+
+ apiCall = $"{apiCall}?{string.Join("&", items.Select(x => $"{x.Key}={x.Value}"))}";
+
+ HttpResponseMessage response = await HttpClient.PostAsync(apiCall, new StringContent(string.Empty));
+ await HandleResponse(response);
+ var responseBody = await response.Content.ReadAsStringAsync();
+ return (new JsonDotNetSerializer() { RootProperty = "activityLog" }).Deserialize(responseBody);
+ }
+
+ ///
+ /// The Get Activity Logs List endpoint retrieves a list of a user's activity log entries before or after a given day with offset and limit using units in the unit system which corresponds to the Accept-Language header provided. - https://dev.fitbit.com/docs/activity/#get-activity-logs-list
+ ///
+ /// The date in the format yyyy-MM-ddTHH:mm:ss. Only yyyy-MM-dd is required. Either beforeDate or afterDate must be specified. Set sort to desc when using beforeDate.
+ /// The date in the format yyyy-MM-ddTHH:mm:ss. Only yyyy-MM-dd is required. Either beforeDate or afterDate must be specified. Set sort to asc when using afterDate.
+ /// The max of the number of entries returned (maximum: 20)
+ /// encoded user id, can be null for current logged in user
+ /// ActivityLogsList
+ public async Task GetActivityLogsListAsync(DateTime? beforeDate, DateTime? afterDate, int limit = 20, string encodedUserId = default(string))
+ {
+ //Check to make sure limit is gt 1 and less than 20
+ limit = limit < 1 || limit > 20 ? 20 : limit;
+
+ const int offset = 0;
+ var sort = string.Empty;
+ var dateString = string.Empty;
+ var date = string.Empty;
+
+ if (beforeDate != null && afterDate != null)
+ {
+ throw new ArgumentException("Please only specify a beforeDate or afterDate, not both: https://dev.fitbit.com/docs/activity/#get-activity-logs-list");
+ }
+
+ if (beforeDate != null)
+ {
+ dateString = "beforeDate";
+ date = beforeDate.Value.ToString("yyyy-MM-dd");
+ sort = "desc";
+ }
+ if (afterDate != null)
+ {
+ dateString = "afterDate";
+ date = afterDate.Value.ToString("yyyy-MM-dd");
+ sort = "asc";
+ }
+
+ string apiCall = FitbitClientHelperExtensions.ToFullUrl("/1/user/{0}/activities/list.json?{1}={2}&sort={3}&limit={4}&offset={5}", encodedUserId, dateString, date, sort, limit, offset);
+
+ HttpResponseMessage response = await HttpClient.GetAsync(apiCall);
+ await HandleResponse(response);
+
+ string responseBody = await response.Content.ReadAsStringAsync();
+ JsonSerializerSettings settings = new JsonSerializerSettings { DateParseHandling = DateParseHandling.DateTimeOffset };
+ JsonDotNetSerializer serializer = new JsonDotNetSerializer(settings);
+ ActivityLogsList result = serializer.Deserialize(responseBody);
+
+ return result;
+ }
+
+ ///
+ /// Retrieves a list of a user's activity log entries on a given day (Max: 20 records)
+ ///
+ /// The date of Activities.
+ /// encoded user id, can be null for current logged in user
+ /// ActivityLogsList
+ public async Task GetActivityLogsListAsync(DateTime date, string encodedUserId = default(string))
+ {
+ ActivityLogsList logsAfterDate = await GetActivityLogsListAsync(null, date, 20, encodedUserId);
+
+ ActivityLogsList result = new ActivityLogsList()
+ {
+ Activities = logsAfterDate?.Activities?.Where(x => x.StartTime.Date == date.Date).ToList()
+ };
+
+ return result;
+ }
+
+ #region HeartRateTimeSeries
+
+ private async Task ProcessHeartRateTimeSeries(string url)
+ {
+ HttpResponseMessage response = await HttpClient.GetAsync(url);
+ await HandleResponse(response);
+
+ string responseBody = await response.Content.ReadAsStringAsync();
+ var seralizer = new JsonDotNetSerializer();
+ var fitbitResponse = seralizer.GetHeartActivitiesTimeSeries(responseBody);
+
+ return fitbitResponse;
+ }
+
+ ///
+ /// Requests the Heart Rate Time Series for a specific time period.
+ ///
+ /// The end date of the period specified.
+ /// The range for which data will be returned.
+ /// The encoded ID of the user.
+ ///
+ public async Task GetHeartRateTimeSeries(DateTime date, DateRangePeriod dateRangePeriod, string userId = "-")
+ {
+ string url = "1.1/user/{0}/" + "activities/heart/date/" + date.ToString("yyyy-MM-dd") + "/"+dateRangePeriod.GetStringValue() + ".json";
+ string apiCall = FitbitClientHelperExtensions.ToFullUrl(url, userId);
+ return await ProcessHeartRateTimeSeries(apiCall);
+ }
+
+ #endregion
+
+ #region HeartRateIntraday
+
+ private async Task ProcessHeartRateIntradayTimeSeries(DateTime date, string url)
+ {
+ HttpResponseMessage response = await HttpClient.GetAsync(url);
+ await HandleResponse(response);
+
+ string responseBody = await response.Content.ReadAsStringAsync();
+ var seralizer = new JsonDotNetSerializer();
+ var fitbitResponse = seralizer.GetHeartRateIntraday(date, responseBody);
+
+ return fitbitResponse;
+ }
+
+ private string GetHeartRateResolution(HeartRateResolution res)
+ {
+ switch (res)
+ {
+ case HeartRateResolution.oneSecond:
+ return "1sec";
+ case HeartRateResolution.oneMinute:
+ return "1min";
+ case HeartRateResolution.fifteenMinute:
+ return "15min";
+ default:
+ return "15min";
+ }
+ }
+
+ ///
+ /// Requests the Intraday Heart Rate Time Series for a specific date.
+ ///
+ /// The start date and time of series.
+ /// Number of data points to include.
+ /// Optional: Encoded id of the user.
+ ///
+ public async Task GetHeartRateIntraday(DateTime date, HeartRateResolution resolution, string encodedUserId = "-")
+ {
+ string resolutionText = GetHeartRateResolution(resolution);
+
+ string apiPath = $"1.1/user/{encodedUserId}/activities/heart/date/{date:yyyy-MM-dd}/{date:yyyy-MM-dd}/{resolutionText}/time/00:00:00/23:59:59.json";
+ string apiCall = FitbitClientHelperExtensions.ToFullUrl(apiPath);
+
+ return await ProcessHeartRateIntradayTimeSeries(date, apiCall);
+ }
+
+ #endregion
+
private string FormatKey(APICollectionType apiCollectionType, string format)
{
string strValue = apiCollectionType == APICollectionType.user ? string.Empty : apiCollectionType.ToString();
@@ -1021,7 +1193,7 @@ private async Task HandleResponse(HttpResponseMessage response)
}
// if we've got here then something unexpected has occured
- throw new FitbitException($"An error has occured. Please see error list for details - {response.StatusCode}", errors);
+ throw new FitbitException($"An error has occured. Please see error list for details - {(int)response.StatusCode}", errors);
}
}
diff --git a/Fitbit.Portable/FitbitClientHelperExtensions.cs b/Fitbit.Portable/FitbitClientHelperExtensions.cs
index 8498bc76..865788d5 100644
--- a/Fitbit.Portable/FitbitClientHelperExtensions.cs
+++ b/Fitbit.Portable/FitbitClientHelperExtensions.cs
@@ -10,10 +10,12 @@ internal static class FitbitClientHelperExtensions
///
/// Converts the REST api resource into the fully qualified url
///
- ///
+ ///
+ ///"Format String" with one "Format Item" as a placeholder for "UserId"
+ ///
///
///
- ///
+ /// Fully qualified url
internal static string ToFullUrl(string apiCall, string encodedUserId = default(string), params object[] args)
{
string userSignifier = "-"; //used for current user
diff --git a/Fitbit.Portable/FitbitParseException.cs b/Fitbit.Portable/FitbitParseException.cs
new file mode 100644
index 00000000..7c24a8b0
--- /dev/null
+++ b/Fitbit.Portable/FitbitParseException.cs
@@ -0,0 +1,21 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Fitbit.Api.Portable
+{
+ public class FitbitParseException: Exception
+ {
+ private const string DefaultMessage = "Error occured while trying to parse JSON.";
+ public FitbitParseException(Exception ex, string message = DefaultMessage) : base(message, ex)
+ {
+
+ }
+
+ public FitbitParseException(string message = DefaultMessage) : base(message)
+ {
+
+ }
+ }
+}
diff --git a/Fitbit.Portable/FitbitRequestException.cs b/Fitbit.Portable/FitbitRequestException.cs
index 5e865199..f89bedd0 100644
--- a/Fitbit.Portable/FitbitRequestException.cs
+++ b/Fitbit.Portable/FitbitRequestException.cs
@@ -11,7 +11,7 @@ public class FitbitRequestException : FitbitException
public HttpResponseMessage Response { get; set; }
public FitbitRequestException(HttpResponseMessage response, IEnumerable errors, string message = default(string), Exception innerEx = null)
- : base(message ?? $"Fitbit Request exception - Http Status Code: {response.StatusCode} - see errors for more details.", errors, innerEx)
+ : base(message ?? $"Fitbit Request exception - Http Status Code: {(int)response.StatusCode} - see errors for more details.", errors, innerEx)
{
this.Response = response;
}
diff --git a/Fitbit.Portable/FitbitTokenException.cs b/Fitbit.Portable/FitbitTokenException.cs
index 1cd45318..d2c70d9a 100644
--- a/Fitbit.Portable/FitbitTokenException.cs
+++ b/Fitbit.Portable/FitbitTokenException.cs
@@ -7,7 +7,7 @@ namespace Fitbit.Api.Portable
public class FitbitTokenException : FitbitRequestException
{
public FitbitTokenException(HttpResponseMessage response, IEnumerable errors = null, string message = default(string))
- : base(response, errors, message ?? $"Fitbit Token exception - HTTP Status Code-- {response.StatusCode} -- see errors for more details.")
+ : base(response, errors, message ?? $"Fitbit Token exception - HTTP Status Code-- {(int)response.StatusCode} -- see errors for more details.")
{
}
}
diff --git a/Fitbit.Portable/IFitbitClient.cs b/Fitbit.Portable/IFitbitClient.cs
index 80d89719..f0b916b7 100644
--- a/Fitbit.Portable/IFitbitClient.cs
+++ b/Fitbit.Portable/IFitbitClient.cs
@@ -18,8 +18,6 @@ public interface IFitbitClient
Task PostLogSleepAsync(string startTime, int duration, DateTime date, string encodedUserId = default(string));
Task> GetDevicesAsync();
Task> GetFriendsAsync(string encodedUserId = default(string));
- Task GetHeartRateTimeSeries(DateTime date, DateRangePeriod dateRangePeriod, string userId = null);
- Task GetHeartRateIntraday(DateTime date, HeartRateResolution resolution);
Task GetUserProfileAsync(string encodedUserId = default(string));
Task GetTimeSeriesAsync(TimeSeriesResourceType timeSeriesResourceType, DateTime startDate, DateTime endDate, string encodedUserId = default(string));
Task GetTimeSeriesAsync(TimeSeriesResourceType timeSeriesResourceType, DateTime endDate, DateRangePeriod period, string encodedUserId = default(string));
@@ -37,9 +35,14 @@ public interface IFitbitClient
Task GetWaterAsync(DateTime date);
Task LogWaterAsync(DateTime date, WaterLog log);
Task DeleteWaterLogAsync(long logId);
-
Task> GetSubscriptionsAsync();
Task AddSubscriptionAsync(APICollectionType apiCollectionType, string uniqueSubscriptionId, string subscriberId = default(string));
Task DeleteSubscriptionAsync(APICollectionType collection, string uniqueSubscriptionId, string subscriberId = null);
+ Task LogActivityAsync(ActivityLog model);
+ Task GetHeartRateTimeSeries(DateTime date, DateRangePeriod dateRangePeriod, string userId = "-");
+ Task GetHeartRateIntraday(DateTime date, HeartRateResolution resolution, string userId = "-");
+ Task GetActivityLogsListAsync(DateTime? beforeDate, DateTime? afterDate, int limit = 20, string encodedUserId = default(string));
+ Task GetActivityLogsListAsync(DateTime date, string encodedUserId = default(string));
+
}
}
\ No newline at end of file
diff --git a/Fitbit.Portable/JsonDotNetSerializer.cs b/Fitbit.Portable/JsonDotNetSerializer.cs
index 14abd7d9..7da23b01 100644
--- a/Fitbit.Portable/JsonDotNetSerializer.cs
+++ b/Fitbit.Portable/JsonDotNetSerializer.cs
@@ -1,4 +1,5 @@
-using Newtonsoft.Json;
+using System;
+using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace Fitbit.Api.Portable
@@ -6,12 +7,12 @@ namespace Fitbit.Api.Portable
internal class JsonDotNetSerializer
{
private readonly JsonSerializer _jsonSerializer;
-
- public JsonDotNetSerializer()
+ private readonly JsonSerializerSettings _settings;
+ public JsonDotNetSerializer(JsonSerializerSettings settings = null)
{
- JsonSerializerSettings settings = new JsonSerializerSettings();
- settings.Converters.Add(new EmptyDateToMinDateConverter());
- _jsonSerializer = JsonSerializer.CreateDefault(settings);
+ _settings = settings ?? new JsonSerializerSettings();
+ _settings.Converters.Add(new EmptyDateToMinDateConverter());
+ _jsonSerializer = JsonSerializer.CreateDefault(_settings);
}
///
@@ -27,6 +28,23 @@ internal T Deserialize(string data)
return default(T);
}
+ if (_settings.DateParseHandling == DateParseHandling.DateTimeOffset )
+ {
+ /* Json.NET conversions do not correctly handle datetimeoffsets by default.
+ Instead they convert the offset into the local time of the server running the code.
+ This is problematic for using Fitbit data sets that include the user's timezone info.
+ In order to get around this, DateParseHandling.DateTimeOffset is set on the JsonConvert serializer.
+ Unfortunately, Jtoken.Parse does not have this ability and can not be used for this purpose.
+ On the flip side, JsonConvert does not seem to allow a RootProperty, so right now
+ only one or the other can be used.*/
+ if (!string.IsNullOrWhiteSpace(RootProperty))
+ {
+ var message = "Error occured by parsing JSON. Root property not compatible with DateParseHandling.DateTimeOffset";
+ throw new FitbitParseException(message);
+ }
+ return JsonConvert.DeserializeObject(data);
+ }
+
JToken o = JToken.Parse(data);
return Deserialize(o);
}
@@ -39,6 +57,8 @@ internal T Deserialize(JToken token)
}
T result = string.IsNullOrWhiteSpace(RootProperty) ? token.ToObject(_jsonSerializer) : token[RootProperty].ToObject(_jsonSerializer);
+
+ // T result = string.IsNullOrWhiteSpace(RootProperty) ? token.ToObject(_jsonSerializer) : token[RootProperty].ToObject(_jsonSerializer);
return result;
}
}
diff --git a/Fitbit.Portable/JsonDotNetSerializerExtensions.cs b/Fitbit.Portable/JsonDotNetSerializerExtensions.cs
index 40ed1d2b..9e137736 100644
--- a/Fitbit.Portable/JsonDotNetSerializerExtensions.cs
+++ b/Fitbit.Portable/JsonDotNetSerializerExtensions.cs
@@ -1,6 +1,8 @@
using System;
using System.Collections.Generic;
using System.Linq;
+using Fitbit.Api.Models;
+using Fitbit.Api.Portable.Models;
using Fitbit.Models;
using Newtonsoft.Json.Linq;
@@ -105,6 +107,7 @@ internal static HeartActivitiesIntraday GetHeartRateIntraday(this JsonDotNetSeri
var result = new HeartActivitiesIntraday
{
+ ActivitiesHeart = serializer.Deserialize(JToken.Parse(heartRateIntradayJson)["activities-heart"].First()),
Dataset = (from item in dataset
select new DatasetInterval
{
@@ -137,7 +140,8 @@ internal static HeartActivitiesTimeSeries GetHeartActivitiesTimeSeries(this Json
{
DateTime = DateTime.Parse(item["dateTime"].ToString()), //here, maybe pass in the date so we have a full object of date and time
HeartRateZones = serializer.Deserialize>(item["value"]["heartRateZones"]),
- CustomHeartRateZones = serializer.Deserialize>(item["value"]["customHeartRateZones"])
+ CustomHeartRateZones = serializer.Deserialize>(item["value"]["customHeartRateZones"]),
+ RestingHeartRate = serializer.Deserialize(item["value"]["restingHeartRate"])
}).ToList(),
};
diff --git a/Fitbit.Portable/Models/Activities.cs b/Fitbit.Portable/Models/Activities.cs
new file mode 100644
index 00000000..15cd5ba5
--- /dev/null
+++ b/Fitbit.Portable/Models/Activities.cs
@@ -0,0 +1,81 @@
+using System;
+using System.Collections.Generic;
+using Fitbit.Models;
+using Newtonsoft.Json;
+
+namespace Fitbit.Api.Portable.Models
+{
+ public class Activities
+ {
+ [JsonProperty(PropertyName = "activeDuration")]
+ public int ActiveDuration { get; set; }
+
+ [JsonProperty(PropertyName = "activityLevel")]
+ public List ActivityLevel { get; set; }
+
+ [JsonProperty(PropertyName = "activityName")]
+ public string ActivityName { get; set; }
+
+ [JsonProperty(PropertyName = "activityTypeId")]
+ public int ActivityTypeId { get; set; }
+
+ [JsonProperty(PropertyName = "averageHeartRate")]
+ public int AverageHeartRate { get; set; }
+
+ [JsonProperty(PropertyName = "calories")]
+ public int Calories { get; set; }
+
+ public string DateOfActivity => StartTime.Date.ToString("MM-dd-yyyy");
+
+ [JsonProperty(PropertyName = "distance")]
+ public double Distance { get; set; }
+
+ [JsonProperty(PropertyName = "distanceUnit")]
+ public string DistanceUnit { get; set; }
+
+ [JsonProperty(PropertyName = "duration")]
+ public int Duration { get; set; }
+
+ [JsonProperty(PropertyName = "elevationGain")]
+ public double ElevationGain { get; set; }
+
+ [JsonProperty(PropertyName = "heartRateZones")]
+ public List HeartRateZones { get; set; }
+
+ [JsonProperty(PropertyName = "lastModified")]
+ public DateTimeOffset LastModified { get; set; }
+
+ [JsonProperty(PropertyName = "logId")]
+ public long LogId { get; set; }
+
+ [JsonProperty(PropertyName = "logType")]
+ public string LogType { get; set; }
+
+ [JsonProperty(PropertyName = "manualValuesSpecified")]
+ public ManualValuesSpecified ManualValuesSpecified { get; set; }
+
+ [JsonProperty(PropertyName = "originalDuration")]
+ public int OriginalDuration { get; set; }
+
+ [JsonProperty(PropertyName = "originalStartTime")]
+ public DateTimeOffset OriginalStartTime { get; set; }
+
+ [JsonProperty(PropertyName = "pace")]
+ public double Pace { get; set; }
+
+ [JsonProperty(PropertyName = "source")]
+ public ActivityLogSource Source { get; set; }
+
+ [JsonProperty(PropertyName = "speed")]
+ public double Speed { get; set; }
+
+ [JsonProperty(PropertyName = "startTime")]
+ public DateTimeOffset StartTime { get; set; }
+
+ [JsonProperty(PropertyName = "steps")]
+ public int Steps { get; set; }
+
+ [JsonProperty(PropertyName = "tcxLink")]
+ public string TcxLink { get; set; }
+ }
+}
diff --git a/Fitbit.Portable/Models/ActivityLevel.cs b/Fitbit.Portable/Models/ActivityLevel.cs
new file mode 100644
index 00000000..2113a1d9
--- /dev/null
+++ b/Fitbit.Portable/Models/ActivityLevel.cs
@@ -0,0 +1,17 @@
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Fitbit.Api.Portable.Models
+{
+ public class ActivityLevel
+ {
+ [JsonProperty(PropertyName = "minutes")]
+ public int Minutes { get; set; }
+
+ [JsonProperty(PropertyName = "name")]
+ public string Name { get; set; }
+ }
+}
diff --git a/Fitbit.Portable/Models/ActivityLog.cs b/Fitbit.Portable/Models/ActivityLog.cs
index 15c0c137..94ac2a4a 100644
--- a/Fitbit.Portable/Models/ActivityLog.cs
+++ b/Fitbit.Portable/Models/ActivityLog.cs
@@ -27,6 +27,7 @@ public class ActivityLog
public bool IsFavorite { get; set; }
public long LogId { get; set; }
public string Name { get; set; }
+ public string Date { get; set; }
public string StartTime { get; set; }
public int Steps { get; set; }
}
diff --git a/Fitbit.Portable/Models/ActivityLogSource.cs b/Fitbit.Portable/Models/ActivityLogSource.cs
new file mode 100644
index 00000000..922416e3
--- /dev/null
+++ b/Fitbit.Portable/Models/ActivityLogSource.cs
@@ -0,0 +1,23 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Newtonsoft.Json;
+
+namespace Fitbit.Api.Portable.Models
+{
+ public class ActivityLogSource
+ {
+ [JsonProperty(PropertyName = "id")]
+ public string Id { get; set; }
+
+ [JsonProperty(PropertyName = "name")]
+ public string Name { get; set; }
+
+ [JsonProperty(PropertyName = "type")]
+ public string Type { get; set; }
+
+ [JsonProperty(PropertyName = "url")]
+ public string Url { get; set; }
+ }
+}
diff --git a/Fitbit.Portable/Models/ActivityLogsList.cs b/Fitbit.Portable/Models/ActivityLogsList.cs
new file mode 100644
index 00000000..10990445
--- /dev/null
+++ b/Fitbit.Portable/Models/ActivityLogsList.cs
@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using Fitbit.Models;
+using Newtonsoft.Json;
+
+namespace Fitbit.Api.Portable.Models
+{
+ public class ActivityLogsList
+ {
+ [JsonProperty(PropertyName = "activities")]
+ public List Activities{ get; set; }
+
+
+ }
+}
diff --git a/Fitbit.Portable/Models/DatasetInterval.cs b/Fitbit.Portable/Models/DatasetInterval.cs
new file mode 100644
index 00000000..6de290f3
--- /dev/null
+++ b/Fitbit.Portable/Models/DatasetInterval.cs
@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Fitbit.Api.Portable.Models
+{
+ //[JsonConverter(typeof(DatasetIntervalConverter))]
+ public class DatasetInterval
+ {
+ public DateTime Time { get; set; }
+ public int Value { get; set; }
+ }
+}
diff --git a/Fitbit.Portable/Models/HeartActivities.cs b/Fitbit.Portable/Models/HeartActivities.cs
index 9841c829..a1f02c64 100644
--- a/Fitbit.Portable/Models/HeartActivities.cs
+++ b/Fitbit.Portable/Models/HeartActivities.cs
@@ -5,14 +5,9 @@ namespace Fitbit.Models
{
public class HeartActivities
{
-
public DateTime DateTime { get; set; }
public List HeartRateZones { get; set; }
-
public List CustomHeartRateZones { get; set; }
-
- public float AverageHeartRate { get; set; }
-
public int RestingHeartRate { get; set; }
}
}
diff --git a/Fitbit.Portable/Models/HeartActivitiesIntraday.cs b/Fitbit.Portable/Models/HeartActivitiesIntraday.cs
index f6a85d65..08f5aa76 100644
--- a/Fitbit.Portable/Models/HeartActivitiesIntraday.cs
+++ b/Fitbit.Portable/Models/HeartActivitiesIntraday.cs
@@ -1,136 +1,20 @@
using System;
using System.Collections.Generic;
using System.Linq;
+using Fitbit.Api.Models;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
#if NETSTANDARD1_3
using System.Reflection;
#endif
-namespace Fitbit.Models
+namespace Fitbit.Api.Portable.Models
{
- //[JsonConverter(typeof(HeartActivitiesIntradayConverter))]
public class HeartActivitiesIntraday
{
+ public IntradayActivitiesHeart ActivitiesHeart { get; set; }
public List Dataset { get; set; }
-
public int DatasetInterval { get; set; }
public string DatasetType { get; set; }
}
-
- //[JsonConverter(typeof(DatasetIntervalConverter))]
- public class DatasetInterval
- {
- public DateTime Time { get; set; }
- public int Value { get; set;}
- }
-
- public class HeartActivitiesIntradayConverter : JsonConverter
- {
- public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
- {
- var heartActivitiesIntraday = value as HeartActivitiesIntraday;
-
- //{
- writer.WriteStartObject();
-
- // "DatasetInterval" : "1"
- writer.WritePropertyName("DatasetInterval");
- writer.WriteValue(heartActivitiesIntraday.DatasetInterval);
-
- // "DatasetType" : "SecondsHeartrate"
- writer.WritePropertyName("DatasetType");
- writer.WriteValue(heartActivitiesIntraday.DatasetType);
-
- writer.WritePropertyName("Dataset");
- writer.WriteStartArray();
- foreach (var datasetInverval in heartActivitiesIntraday.Dataset)
- {
- // "Time" : "2008-09-22T14:01:54.9571247Z"
- writer.WritePropertyName("Time");
- writer.WriteValue(datasetInverval.Time.ToString("o"));
-
- // "Value": 1
- writer.WritePropertyName("Value");
- writer.WriteValue(datasetInverval.Value);
-
- }
- writer.WriteEndArray();
-
- //}
- writer.WriteEndObject();
-
- }
-
- public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
- {
- JObject jsonObject = JObject.Load(reader);
- var properties = jsonObject.Properties().ToList();
-
- HeartActivitiesIntraday result = new HeartActivitiesIntraday();
- result.DatasetInterval = Convert.ToInt32(jsonObject["DatasetInterval"]);
- result.DatasetType = jsonObject["DatasetType"].ToString();
- result.Dataset = new List();
-
- foreach(JToken item in jsonObject["Dataset"].Children())
- {
- result.Dataset.Add(new DatasetInterval()
- {
- Time = DateTime.Parse(item["Time"].ToString()),
- Value = Convert.ToInt32(item["Value"])
- });
- };
-
- return result;
- }
-
- public override bool CanConvert(Type objectType)
- {
-#if NETSTANDARD1_3
- return typeof(HeartActivitiesIntraday).GetTypeInfo().IsAssignableFrom(objectType.GetTypeInfo());
-#else
- return typeof(HeartActivitiesIntraday).IsAssignableFrom(objectType);
-#endif
- }
- }
-
- /*
- public class DatasetIntervalConverter : JsonConverter
- {
- public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
- {
- var datasetInverval = value as DatasetInterval;
-
- //{
- writer.WriteStartObject();
-
- // "Time" : "2008-09-22T14:01:54.9571247Z"
- writer.WritePropertyName("Time");
- writer.WriteValue(datasetInverval.Time.ToString("o"));
-
- // "Value": 1
- writer.WritePropertyName("Value");
- writer.WriteValue(datasetInverval.Value);
-
- //}
- writer.WriteEndObject();
-
- }
-
- public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
- {
- JObject jsonObject = JObject.Load(reader);
- var properties = jsonObject.Properties().ToList();
- return new DatasetInterval
- {
- Time = DateTime.Parse(jsonObject["Time"].ToString()),
- Value = Convert.ToInt32(jsonObject["Value"])
- };
- }
-
- public override bool CanConvert(Type objectType)
- {
- return typeof(DatasetInterval).IsAssignableFrom(objectType);
- }
- } */
}
diff --git a/Fitbit.Portable/Models/HeartActivitiesIntradayConverter.cs b/Fitbit.Portable/Models/HeartActivitiesIntradayConverter.cs
new file mode 100644
index 00000000..ad35852d
--- /dev/null
+++ b/Fitbit.Portable/Models/HeartActivitiesIntradayConverter.cs
@@ -0,0 +1,80 @@
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using Fitbit.Models;
+using Newtonsoft.Json.Linq;
+
+namespace Fitbit.Api.Portable.Models
+{
+ public class HeartActivitiesIntradayConverter : JsonConverter
+ {
+ public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
+ {
+ var heartActivitiesIntraday = value as HeartActivitiesIntraday;
+
+ //{
+ writer.WriteStartObject();
+
+ // "DatasetInterval" : "1"
+ writer.WritePropertyName("DatasetInterval");
+ writer.WriteValue(heartActivitiesIntraday.DatasetInterval);
+
+ // "DatasetType" : "SecondsHeartrate"
+ writer.WritePropertyName("DatasetType");
+ writer.WriteValue(heartActivitiesIntraday.DatasetType);
+
+ writer.WritePropertyName("Dataset");
+ writer.WriteStartArray();
+ foreach (var datasetInverval in heartActivitiesIntraday.Dataset)
+ {
+ // "Time" : "2008-09-22T14:01:54.9571247Z"
+ writer.WritePropertyName("Time");
+ writer.WriteValue(datasetInverval.Time.ToString("o"));
+
+ // "Value": 1
+ writer.WritePropertyName("Value");
+ writer.WriteValue(datasetInverval.Value);
+
+ }
+ writer.WriteEndArray();
+
+ //}
+ writer.WriteEndObject();
+
+ }
+
+ public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
+ {
+ JObject jsonObject = JObject.Load(reader);
+ var properties = jsonObject.Properties().ToList();
+
+ HeartActivitiesIntraday result = new HeartActivitiesIntraday();
+ result.DatasetInterval = Convert.ToInt32(jsonObject["DatasetInterval"]);
+ result.DatasetType = jsonObject["DatasetType"].ToString();
+ result.Dataset = new List();
+
+ foreach (JToken item in jsonObject["Dataset"].Children())
+ {
+ result.Dataset.Add(new DatasetInterval()
+ {
+ Time = DateTime.Parse(item["Time"].ToString()),
+ Value = Convert.ToInt32(item["Value"])
+ });
+ };
+
+ return result;
+ }
+
+ public override bool CanConvert(Type objectType)
+ {
+#if NETSTANDARD1_3
+ return typeof(HeartActivitiesIntraday).GetTypeInfo().IsAssignableFrom(objectType.GetTypeInfo());
+#else
+ return typeof(HeartActivitiesIntraday).IsAssignableFrom(objectType);
+#endif
+ }
+ }
+}
diff --git a/Fitbit.Portable/Models/HeartActivitiesTimeSeries.cs b/Fitbit.Portable/Models/HeartActivitiesTimeSeries.cs
index 143ff27f..e4cd134d 100644
--- a/Fitbit.Portable/Models/HeartActivitiesTimeSeries.cs
+++ b/Fitbit.Portable/Models/HeartActivitiesTimeSeries.cs
@@ -6,4 +6,4 @@ public class HeartActivitiesTimeSeries
{
public List HeartActivities { get; set; }
}
-}
+}
\ No newline at end of file
diff --git a/Fitbit.Portable/Models/HeartRateZone.cs b/Fitbit.Portable/Models/HeartRateZone.cs
index ebf306dc..74121ffd 100644
--- a/Fitbit.Portable/Models/HeartRateZone.cs
+++ b/Fitbit.Portable/Models/HeartRateZone.cs
@@ -1,11 +1,22 @@
-namespace Fitbit.Models
+using Newtonsoft.Json;
+
+namespace Fitbit.Models
{
public class HeartRateZone
{
- public float CaloriesOut { get; set; }
+ [JsonProperty(PropertyName = "caloriesOut")]
+ public double CaloriesOut { get; set; }
+
+ [JsonProperty(PropertyName = "max")]
public int Max { get; set; }
+
+ [JsonProperty(PropertyName = "min")]
public int Min { get; set; }
+
+ [JsonProperty(PropertyName = "minutes")]
public int Minutes { get; set; }
+
+ [JsonProperty(PropertyName = "name")]
public string Name { get; set; }
}
}
diff --git a/Fitbit.Portable/Models/IntradayActivitiesHeart.cs b/Fitbit.Portable/Models/IntradayActivitiesHeart.cs
new file mode 100644
index 00000000..2c6238c0
--- /dev/null
+++ b/Fitbit.Portable/Models/IntradayActivitiesHeart.cs
@@ -0,0 +1,24 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Fitbit.Models;
+using Newtonsoft.Json;
+
+namespace Fitbit.Api.Models
+{
+ public class IntradayActivitiesHeart
+ {
+ [JsonProperty(PropertyName = "customHeartRateZones")]
+ public List CustomHeartRateZones { get; set; }
+
+ [JsonProperty(PropertyName = "heartRateZones")]
+ public List HeartRateZones { get; set; }
+
+ [JsonProperty(PropertyName = "dateTime")]
+ public DateTime DateTime { get; set; }
+
+ [JsonProperty(PropertyName = "value")]
+ public double Value { get; set; }
+ }
+}
diff --git a/Fitbit.Portable/Models/ManualValuesSpecified.cs b/Fitbit.Portable/Models/ManualValuesSpecified.cs
new file mode 100644
index 00000000..13bfffe9
--- /dev/null
+++ b/Fitbit.Portable/Models/ManualValuesSpecified.cs
@@ -0,0 +1,20 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Newtonsoft.Json;
+
+namespace Fitbit.Api.Portable.Models
+{
+ public class ManualValuesSpecified
+ {
+ [JsonProperty(PropertyName = "calories")]
+ public bool Calories { get; set; }
+
+ [JsonProperty(PropertyName = "distance")]
+ public bool Distance { get; set; }
+
+ [JsonProperty(PropertyName = "steps")]
+ public bool Steps { get; set; }
+ }
+}
diff --git a/Fitbit.Portable/OAuth2/OAuth2AutoRefreshInterceptor.cs b/Fitbit.Portable/OAuth2/OAuth2AutoRefreshInterceptor.cs
index 0f20f2ae..67528bba 100644
--- a/Fitbit.Portable/OAuth2/OAuth2AutoRefreshInterceptor.cs
+++ b/Fitbit.Portable/OAuth2/OAuth2AutoRefreshInterceptor.cs
@@ -44,7 +44,7 @@ public async Task InterceptResponse(Task
-
-
-
-
-
\ No newline at end of file
diff --git a/Fitbit/Fitbit-Live-Debug.sln b/Fitbit/Fitbit-Live-Debug.sln
deleted file mode 100644
index bb83ede4..00000000
--- a/Fitbit/Fitbit-Live-Debug.sln
+++ /dev/null
@@ -1,41 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 14
-VisualStudioVersion = 14.0.24720.0
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Fitbit.Portable", "..\Fitbit.Portable\Fitbit.Portable.csproj", "{1358D3B4-0698-4003-97EB-B6D489E04138}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Fitbit.Portable.Tests", "..\Fitbit.Portable.Tests\Fitbit.Portable.Tests.csproj", "{F811594D-3323-4147-9780-D3A1F930B99F}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Fitbit.Portable.DebugSite", "..\Fitbit.Portable.DebugSite\Fitbit.Portable.DebugSite.csproj", "{61C8AD29-A128-442E-BF0B-539A990B15C7}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Any CPU = Debug|Any CPU
- Release|Any CPU = Release|Any CPU
- TrialRelease|Any CPU = TrialRelease|Any CPU
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {1358D3B4-0698-4003-97EB-B6D489E04138}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {1358D3B4-0698-4003-97EB-B6D489E04138}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {1358D3B4-0698-4003-97EB-B6D489E04138}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {1358D3B4-0698-4003-97EB-B6D489E04138}.Release|Any CPU.Build.0 = Release|Any CPU
- {1358D3B4-0698-4003-97EB-B6D489E04138}.TrialRelease|Any CPU.ActiveCfg = Release|Any CPU
- {1358D3B4-0698-4003-97EB-B6D489E04138}.TrialRelease|Any CPU.Build.0 = Release|Any CPU
- {F811594D-3323-4147-9780-D3A1F930B99F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {F811594D-3323-4147-9780-D3A1F930B99F}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {F811594D-3323-4147-9780-D3A1F930B99F}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {F811594D-3323-4147-9780-D3A1F930B99F}.Release|Any CPU.Build.0 = Release|Any CPU
- {F811594D-3323-4147-9780-D3A1F930B99F}.TrialRelease|Any CPU.ActiveCfg = Release|Any CPU
- {F811594D-3323-4147-9780-D3A1F930B99F}.TrialRelease|Any CPU.Build.0 = Release|Any CPU
- {61C8AD29-A128-442E-BF0B-539A990B15C7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {61C8AD29-A128-442E-BF0B-539A990B15C7}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {61C8AD29-A128-442E-BF0B-539A990B15C7}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {61C8AD29-A128-442E-BF0B-539A990B15C7}.Release|Any CPU.Build.0 = Release|Any CPU
- {61C8AD29-A128-442E-BF0B-539A990B15C7}.TrialRelease|Any CPU.ActiveCfg = Release|Any CPU
- {61C8AD29-A128-442E-BF0B-539A990B15C7}.TrialRelease|Any CPU.Build.0 = Release|Any CPU
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
diff --git a/Fitbit/Fitbit-OAuth2-Sample.sln b/Fitbit/Fitbit-OAuth2-Sample.sln
deleted file mode 100644
index 01bb7fdb..00000000
--- a/Fitbit/Fitbit-OAuth2-Sample.sln
+++ /dev/null
@@ -1,25 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 14
-VisualStudioVersion = 14.0.24720.0
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SampleWebMVCOAuth2", "..\SampleWebMVCOAuth2\SampleWebMVCOAuth2.csproj", "{61C8AD29-A128-442E-BF0B-539A990B15C7}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Any CPU = Debug|Any CPU
- Release|Any CPU = Release|Any CPU
- TrialRelease|Any CPU = TrialRelease|Any CPU
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {61C8AD29-A128-442E-BF0B-539A990B15C7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {61C8AD29-A128-442E-BF0B-539A990B15C7}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {61C8AD29-A128-442E-BF0B-539A990B15C7}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {61C8AD29-A128-442E-BF0B-539A990B15C7}.Release|Any CPU.Build.0 = Release|Any CPU
- {61C8AD29-A128-442E-BF0B-539A990B15C7}.TrialRelease|Any CPU.ActiveCfg = Release|Any CPU
- {61C8AD29-A128-442E-BF0B-539A990B15C7}.TrialRelease|Any CPU.Build.0 = Release|Any CPU
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
diff --git a/Fitbit/Fitbit-WithSamples.sln b/Fitbit/Fitbit-WithSamples.sln
deleted file mode 100644
index 679b14a1..00000000
--- a/Fitbit/Fitbit-WithSamples.sln
+++ /dev/null
@@ -1,69 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 14
-VisualStudioVersion = 14.0.24720.0
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{C284DD15-3355-4C6A-9EE0-D0A3BEA4D8A5}"
- ProjectSection(SolutionItems) = preProject
- .nuget\NuGet.exe = .nuget\NuGet.exe
- .nuget\NuGet.targets = .nuget\NuGet.targets
- EndProjectSection
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Fitbit.Common", "..\Fitbit.Common\Fitbit.Common.csproj", "{37636456-5640-4258-ADF5-11292E6B422E}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Fitbit.Portable", "..\Fitbit.Portable\Fitbit.Portable.csproj", "{1358D3B4-0698-4003-97EB-B6D489E04138}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Fitbit.Portable.Tests", "..\Fitbit.Portable.Tests\Fitbit.Portable.Tests.csproj", "{F811594D-3323-4147-9780-D3A1F930B99F}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Portable", "Portable", "{750B7532-1468-4300-959C-3E23AFE7BE54}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SampleWebMVC.Portable", "..\SampleWebMVC.Portable\SampleWebMVC.Portable.csproj", "{59BAB4ED-CF16-4F5F-BA00-620AB7448970}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SampleWebMVCOAuth2", "..\SampleWebMVCOAuth2\SampleWebMVCOAuth2.csproj", "{61C8AD29-A128-442E-BF0B-539A990B15C7}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Any CPU = Debug|Any CPU
- Release|Any CPU = Release|Any CPU
- TrialRelease|Any CPU = TrialRelease|Any CPU
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {37636456-5640-4258-ADF5-11292E6B422E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {37636456-5640-4258-ADF5-11292E6B422E}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {37636456-5640-4258-ADF5-11292E6B422E}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {37636456-5640-4258-ADF5-11292E6B422E}.Release|Any CPU.Build.0 = Release|Any CPU
- {37636456-5640-4258-ADF5-11292E6B422E}.TrialRelease|Any CPU.ActiveCfg = Release|Any CPU
- {37636456-5640-4258-ADF5-11292E6B422E}.TrialRelease|Any CPU.Build.0 = Release|Any CPU
- {1358D3B4-0698-4003-97EB-B6D489E04138}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {1358D3B4-0698-4003-97EB-B6D489E04138}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {1358D3B4-0698-4003-97EB-B6D489E04138}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {1358D3B4-0698-4003-97EB-B6D489E04138}.Release|Any CPU.Build.0 = Release|Any CPU
- {1358D3B4-0698-4003-97EB-B6D489E04138}.TrialRelease|Any CPU.ActiveCfg = Release|Any CPU
- {1358D3B4-0698-4003-97EB-B6D489E04138}.TrialRelease|Any CPU.Build.0 = Release|Any CPU
- {F811594D-3323-4147-9780-D3A1F930B99F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {F811594D-3323-4147-9780-D3A1F930B99F}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {F811594D-3323-4147-9780-D3A1F930B99F}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {F811594D-3323-4147-9780-D3A1F930B99F}.Release|Any CPU.Build.0 = Release|Any CPU
- {F811594D-3323-4147-9780-D3A1F930B99F}.TrialRelease|Any CPU.ActiveCfg = Release|Any CPU
- {F811594D-3323-4147-9780-D3A1F930B99F}.TrialRelease|Any CPU.Build.0 = Release|Any CPU
- {59BAB4ED-CF16-4F5F-BA00-620AB7448970}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {59BAB4ED-CF16-4F5F-BA00-620AB7448970}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {59BAB4ED-CF16-4F5F-BA00-620AB7448970}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {59BAB4ED-CF16-4F5F-BA00-620AB7448970}.Release|Any CPU.Build.0 = Release|Any CPU
- {59BAB4ED-CF16-4F5F-BA00-620AB7448970}.TrialRelease|Any CPU.ActiveCfg = Release|Any CPU
- {59BAB4ED-CF16-4F5F-BA00-620AB7448970}.TrialRelease|Any CPU.Build.0 = Release|Any CPU
- {61C8AD29-A128-442E-BF0B-539A990B15C7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {61C8AD29-A128-442E-BF0B-539A990B15C7}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {61C8AD29-A128-442E-BF0B-539A990B15C7}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {61C8AD29-A128-442E-BF0B-539A990B15C7}.Release|Any CPU.Build.0 = Release|Any CPU
- {61C8AD29-A128-442E-BF0B-539A990B15C7}.TrialRelease|Any CPU.ActiveCfg = Release|Any CPU
- {61C8AD29-A128-442E-BF0B-539A990B15C7}.TrialRelease|Any CPU.Build.0 = Release|Any CPU
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
- GlobalSection(NestedProjects) = preSolution
- {1358D3B4-0698-4003-97EB-B6D489E04138} = {750B7532-1468-4300-959C-3E23AFE7BE54}
- {F811594D-3323-4147-9780-D3A1F930B99F} = {750B7532-1468-4300-959C-3E23AFE7BE54}
- EndGlobalSection
-EndGlobal
diff --git a/Fitbit/Fitbit.NetCore.sln b/Fitbit/Fitbit.NetCore.sln
deleted file mode 100644
index 60a70d32..00000000
--- a/Fitbit/Fitbit.NetCore.sln
+++ /dev/null
@@ -1,31 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 15
-VisualStudioVersion = 15.0.26725.2
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Fitbit.NetCore", "..\Fitbit.NetCore\Fitbit.NetCore.csproj", "{81F4F528-0E81-49E0-A2B2-ED77495A9C15}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Fitbit.NetCore.Tests", "..\Fitbit.NetCore.Tests\Fitbit.NetCore.Tests.csproj", "{DE9D7F3C-6F6C-43E2-AEE6-32E7DF894F3E}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Any CPU = Debug|Any CPU
- Release|Any CPU = Release|Any CPU
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {81F4F528-0E81-49E0-A2B2-ED77495A9C15}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {81F4F528-0E81-49E0-A2B2-ED77495A9C15}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {81F4F528-0E81-49E0-A2B2-ED77495A9C15}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {81F4F528-0E81-49E0-A2B2-ED77495A9C15}.Release|Any CPU.Build.0 = Release|Any CPU
- {DE9D7F3C-6F6C-43E2-AEE6-32E7DF894F3E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {DE9D7F3C-6F6C-43E2-AEE6-32E7DF894F3E}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {DE9D7F3C-6F6C-43E2-AEE6-32E7DF894F3E}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {DE9D7F3C-6F6C-43E2-AEE6-32E7DF894F3E}.Release|Any CPU.Build.0 = Release|Any CPU
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
- GlobalSection(ExtensibilityGlobals) = postSolution
- SolutionGuid = {9DC6189B-479C-49B5-85B9-BD23083BC667}
- EndGlobalSection
-EndGlobal
diff --git a/Fitbit/Fitbit.OAuth1Migration.sln b/Fitbit/Fitbit.OAuth1Migration.sln
deleted file mode 100644
index 16ec5f72..00000000
--- a/Fitbit/Fitbit.OAuth1Migration.sln
+++ /dev/null
@@ -1,28 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 14
-VisualStudioVersion = 14.0.24720.0
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Fitbit.OAuth1Migration", "..\OAuth1Migration\Fitbit.OAuth1Migration\Fitbit.OAuth1Migration.csproj", "{8FCFBC6C-36B0-4117-814A-2C2EA43F44AC}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Fitbit.OAuth1Migration.Tests", "..\OAuth1Migration\Fitbit.OAuth1Migration.Tests\Fitbit.OAuth1Migration.Tests.csproj", "{346C808A-9ACA-467F-B313-1368EA5306FF}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Any CPU = Debug|Any CPU
- Release|Any CPU = Release|Any CPU
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {8FCFBC6C-36B0-4117-814A-2C2EA43F44AC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {8FCFBC6C-36B0-4117-814A-2C2EA43F44AC}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {8FCFBC6C-36B0-4117-814A-2C2EA43F44AC}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {8FCFBC6C-36B0-4117-814A-2C2EA43F44AC}.Release|Any CPU.Build.0 = Release|Any CPU
- {346C808A-9ACA-467F-B313-1368EA5306FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {346C808A-9ACA-467F-B313-1368EA5306FF}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {346C808A-9ACA-467F-B313-1368EA5306FF}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {346C808A-9ACA-467F-B313-1368EA5306FF}.Release|Any CPU.Build.0 = Release|Any CPU
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
diff --git a/NuGet/Fitbit.NET.1.0.0.nupkg b/NuGet/Fitbit.NET.1.0.0.nupkg
deleted file mode 100644
index 8397e93c..00000000
Binary files a/NuGet/Fitbit.NET.1.0.0.nupkg and /dev/null differ
diff --git a/NuGet/Fitbit.NET.1.1.1.nupkg b/NuGet/Fitbit.NET.1.1.1.nupkg
deleted file mode 100644
index 1849a135..00000000
Binary files a/NuGet/Fitbit.NET.1.1.1.nupkg and /dev/null differ
diff --git a/NuGet/nuget.exe b/NuGet/nuget.exe
deleted file mode 100644
index 19efb10a..00000000
Binary files a/NuGet/nuget.exe and /dev/null differ
diff --git a/NuGet/nupack.bat b/NuGet/nupack.bat
deleted file mode 100644
index eda0c0c8..00000000
--- a/NuGet/nupack.bat
+++ /dev/null
@@ -1,5 +0,0 @@
-rmdir package\lib\net45 /s /q
-"%ProgramFiles(x86)%\MSBuild\14.0\Bin\MSBuild.exe" ..\Fitbit\Fitbit.sln /p:Configuration=Release /m
-mkdir .\package\lib\net45
-copy ..\Fitbit.Portable\bin\Release\* .\package\lib\net45\
-nuget pack .\package\Fitbit.Public.nuspec -properties buildOutputPath=\lib\net45
\ No newline at end of file
diff --git a/NuGet/package/Fitbit.OAuthMigration.Public.nuspec b/NuGet/package/Fitbit.OAuthMigration.Public.nuspec
deleted file mode 100644
index 4630110d..00000000
--- a/NuGet/package/Fitbit.OAuthMigration.Public.nuspec
+++ /dev/null
@@ -1,28 +0,0 @@
-
-
-
- Fitbit.NET.OAuth1Migration
- 1.0.0.0
- Fitbit.NET.OAuth1Migration
- Fitbit.Net contributors Team -- @WestDiscGolf, @aarondcoleman, @mxa0079
-
- https://github.com/aarondcoleman/Fitbit.NET
- https://github.com/aarondcoleman/Fitbit.NET
- http://static3.fitbit.com/simple.b-dis-png.h76d53d8e6a0653b38326a825b2b9cf57.pack?items=%2Fimages%2Fcommon%2Fbg_branding_b.png
- false
- Fitbit API client for .NET
- Complementary libary to Fitbit.Net to aide with migration off OAuth1 and into OAuth2
-
- Complementary libary to Fitbit.Net to aide with migration off OAuth1 and into OAuth2
-
- Copyright 2016
- Fitbit OAuth2 API .NET IoT Wearables
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/NuGet/package/Fitbit.Public.nuspec b/NuGet/package/Fitbit.Public.nuspec
deleted file mode 100644
index e1fe64de..00000000
--- a/NuGet/package/Fitbit.Public.nuspec
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
- Fitbit.NET
- 2.2.0
- Fitbit.NET
- Fitbit.Net contributors Team -- @WestDiscGolf, @aarondcoleman, @mxa0079, @joshFitabase
-
- https://github.com/aarondcoleman/Fitbit.NET
- https://github.com/aarondcoleman/Fitbit.NET
- http://static3.fitbit.com/simple.b-dis-png.h76d53d8e6a0653b38326a825b2b9cf57.pack?items=%2Fimages%2Fcommon%2Fbg_branding_b.png
- false
- Fitbit API client for .NET
- .NET client library to make structure calls to Fitbit API using OAuth2
-
- 2.2 is our full supported version that now strips away all OAuth 1.0 code. This has been thoroughly tested to be stable, with more endpoints to be added to the master branch of Fitbit.NET going forward.
-
- Copyright 2017
- Fitbit OAuth2 API .NET IoT Wearables
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/NuGet/package/Fitbit.dev.nuspec b/NuGet/package/Fitbit.dev.nuspec
deleted file mode 100644
index ae3d7c2c..00000000
--- a/NuGet/package/Fitbit.dev.nuspec
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-
- Fitbit.NET
- 2.1.0$buildNumber$-RC2-Dev
- Fitbit.NET
- Fitbit.Net contributors Team -- @WestDiscGolf, @aarondcoleman, @mxa0079
-
- https://github.com/aarondcoleman/Fitbit.NET
- https://github.com/aarondcoleman/Fitbit.NET
- http://static3.fitbit.com/simple.b-dis-png.h76d53d8e6a0653b38326a825b2b9cf57.pack?items=%2Fimages%2Fcommon%2Fbg_branding_b.png
- false
- Fitbit API client for .NET
- Authenticates with the Fitbit API using OAuth to allow .NET project to make structured calls for a user's data.
-
- 2.0.0 Adds:
- *Support for OAuth 2.0
- *Support for async
- *Request/Response transparent interception through IFitbitInterceptor
-
- Copyright 2016
- Fitbit OAuth API
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/OAuth1Migration/Fitbit.OAuth1Migration.Tests/AuthenticatorTests.cs b/OAuth1Migration/Fitbit.OAuth1Migration.Tests/AuthenticatorTests.cs
deleted file mode 100644
index 35f451f1..00000000
--- a/OAuth1Migration/Fitbit.OAuth1Migration.Tests/AuthenticatorTests.cs
+++ /dev/null
@@ -1,35 +0,0 @@
-using Fitbit.Api.Portable;
-using Fitbit.Models;
-using NUnit.Framework;
-
-namespace Fitbit.OAuth1Migration.Tests
-{
- [TestFixture]
- public class AuthenticatorTests
- {
- [Test] [Category("Portable")]
- public void Constructor()
- {
- var authenticator = new Authenticator("key", "secret");
- Assert.IsNotNull(authenticator);
- Assert.AreEqual("key", authenticator.ConsumerKey);
- Assert.AreEqual("secret", authenticator.ConsumerSecret);
- }
-
- [Test] [Category("Portable")]
- public void Generate_Auth_Url_ForceLogout_True()
- {
- var authenticator = new Authenticator("key", "secret");
- var url = authenticator.GenerateAuthUrlFromRequestToken(new RequestToken {Token = "something"}, true);
- Assert.AreEqual("https://api.fitbit.com/oauth/logout_and_authorize?oauth_token=something", url);
- }
-
- [Test] [Category("Portable")]
- public void Generate_Auth_Url_ForceLogout_False()
- {
- var authenticator = new Authenticator("key", "secret");
- var url = authenticator.GenerateAuthUrlFromRequestToken(new RequestToken { Token = "something" }, false);
- Assert.AreEqual("https://api.fitbit.com/oauth/authorize?oauth_token=something", url);
- }
- }
-}
diff --git a/OAuth1Migration/Fitbit.OAuth1Migration.Tests/Fitbit.OAuth1Migration.Tests.csproj b/OAuth1Migration/Fitbit.OAuth1Migration.Tests/Fitbit.OAuth1Migration.Tests.csproj
deleted file mode 100644
index a6d91ed3..00000000
--- a/OAuth1Migration/Fitbit.OAuth1Migration.Tests/Fitbit.OAuth1Migration.Tests.csproj
+++ /dev/null
@@ -1,153 +0,0 @@
-
-
-
- Debug
- AnyCPU
- {346C808A-9ACA-467F-B313-1368EA5306FF}
- Library
- Properties
- Fitbit.OAuth1Migration.Tests
- Fitbit.OAuth1Migration.Tests
- v4.5.2
- 512
- {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
- 10.0
- $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)
- $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages
- False
- UnitTest
-
-
- true
- full
- false
- bin\Debug\
- DEBUG;TRACE
- prompt
- 4
-
-
- pdbonly
- true
- bin\Release\
- TRACE
- prompt
- 4
-
-
-
- ..\..\Fitbit\packages\AsyncOAuth.0.8.4\lib\AsyncOAuth.dll
- True
-
-
- ..\..\Fitbit\packages\Fitbit.NET.2.0.1-RC3\lib\net451\Fitbit.Portable.dll
- True
-
-
- ..\..\Fitbit\packages\Microsoft.Bcl.Async.1.0.168\lib\net40\Microsoft.Threading.Tasks.dll
- True
-
-
- ..\..\Fitbit\packages\Microsoft.Bcl.Async.1.0.168\lib\net40\Microsoft.Threading.Tasks.Extensions.dll
- True
-
-
- ..\..\Fitbit\packages\Microsoft.Bcl.Async.1.0.168\lib\net40\Microsoft.Threading.Tasks.Extensions.Desktop.dll
- True
-
-
- ..\packages\Newtonsoft.Json.8.0.2\lib\net45\Newtonsoft.Json.dll
- True
-
-
- ..\..\Fitbit\packages\NUnitTestAdapter.2.0.0\lib\nunit.core.dll
- False
-
-
- ..\..\Fitbit\packages\NUnitTestAdapter.2.0.0\lib\nunit.core.interfaces.dll
- False
-
-
- ..\..\Fitbit\packages\NUnit.3.0.1\lib\net45\nunit.framework.dll
- True
-
-
- ..\..\Fitbit\packages\NUnitTestAdapter.2.0.0\lib\nunit.util.dll
- False
-
-
- ..\..\Fitbit\packages\NUnitTestAdapter.2.0.0\lib\NUnit.VisualStudio.TestAdapter.dll
- False
-
-
-
-
-
- ..\..\Fitbit\packages\Microsoft.Net.Http.2.2.22\lib\net45\System.Net.Http.Extensions.dll
- True
-
-
- ..\..\Fitbit\packages\Microsoft.Net.Http.2.2.22\lib\net45\System.Net.Http.Primitives.dll
- True
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {8fcfbc6c-36b0-4117-814a-2c2ea43f44ac}
- Fitbit.OAuth1Migration
-
-
-
-
-
-
-
-
-
- False
-
-
- False
-
-
- False
-
-
- False
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/OAuth1Migration/Fitbit.OAuth1Migration.Tests/Properties/AssemblyInfo.cs b/OAuth1Migration/Fitbit.OAuth1Migration.Tests/Properties/AssemblyInfo.cs
deleted file mode 100644
index f3afebd7..00000000
--- a/OAuth1Migration/Fitbit.OAuth1Migration.Tests/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-
-// General Information about an assembly is controlled through the following
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-[assembly: AssemblyTitle("Fitbit.OAuth1Migration.Tests")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("Fitbit.OAuth1Migration.Tests")]
-[assembly: AssemblyCopyright("Copyright © 2016")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
-
-// Setting ComVisible to false makes the types in this assembly not visible
-// to COM components. If you need to access a type in this assembly from
-// COM, set the ComVisible attribute to true on that type.
-[assembly: ComVisible(false)]
-
-// The following GUID is for the ID of the typelib if this project is exposed to COM
-[assembly: Guid("346c808a-9aca-467f-b313-1368ea5306ff")]
-
-// Version information for an assembly consists of the following four values:
-//
-// Major Version
-// Minor Version
-// Build Number
-// Revision
-//
-// You can specify all the values or you can default the Build and Revision Numbers
-// by using the '*' as shown below:
-// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.0.0.0")]
-[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/OAuth1Migration/Fitbit.OAuth1Migration.Tests/packages.config b/OAuth1Migration/Fitbit.OAuth1Migration.Tests/packages.config
deleted file mode 100644
index 54da0808..00000000
--- a/OAuth1Migration/Fitbit.OAuth1Migration.Tests/packages.config
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/OAuth1Migration/Fitbit.OAuth1Migration/Authenticator.cs b/OAuth1Migration/Fitbit.OAuth1Migration/Authenticator.cs
deleted file mode 100644
index 4918ea7a..00000000
--- a/OAuth1Migration/Fitbit.OAuth1Migration/Authenticator.cs
+++ /dev/null
@@ -1,91 +0,0 @@
-using System;
-using System.Linq;
-using System.Threading.Tasks;
-using AsyncOAuth;
-using Fitbit.Models;
-using RequestToken = Fitbit.Models.RequestToken;
-
-namespace Fitbit.OAuth1Migration
-{
- public class Authenticator
- {
- public string ConsumerKey { get; private set; }
- public string ConsumerSecret { get; private set; }
-
- public Authenticator(string consumerKey, string consumerSecret)
- {
- ConsumerKey = consumerKey;
- ConsumerSecret = consumerSecret;
- }
-
- public string GenerateAuthUrlFromRequestToken(RequestToken token, bool forceLogoutBeforeAuth)
- {
- var url = Constants.BaseApiUrl + (forceLogoutBeforeAuth ? Constants.LogoutAndAuthorizeUri : Constants.AuthorizeUri);
- return string.Format("{0}?oauth_token={1}", url, token.Token);
- }
-
- ///
- /// First step in the OAuth process is to ask Fitbit for a temporary request token.
- /// From this you should store the RequestToken returned for later processing the auth token.
- ///
- ///
- public async Task GetRequestTokenAsync()
- {
- // create authorizer
- var authorizer = new OAuthAuthorizer(ConsumerKey, ConsumerSecret);
-
- // get request token
- var tokenResponse = await authorizer.GetRequestToken(Constants.BaseApiUrl + Constants.TemporaryCredentialsRequestTokenUri);
- var requestToken = tokenResponse.Token;
-
- // return the request token
- return new RequestToken
- {
- Token = requestToken.Key,
- Secret = requestToken.Secret
- };
- }
-
- ///
- /// For Desktop authentication. Your code should direct the user to the FitBit website to get
- /// Their pin, they can then enter it here.
- ///
- ///
- ///
- ///
- public async Task GetAuthCredentialFromPinAsync(string pin, RequestToken token)
- {
- var oauthRequestToken = new AsyncOAuth.RequestToken(token.Token, token.Secret);
- var authorizer = new OAuthAuthorizer(ConsumerKey, ConsumerSecret);
- var accessTokenResponse = await authorizer.GetAccessToken(Constants.BaseApiUrl + Constants.TemporaryCredentialsAccessTokenUri, oauthRequestToken, pin);
- // save access token.
- var accessToken = accessTokenResponse.Token;
- return new AuthCredential
- {
- AuthToken = accessToken.Key,
- AuthTokenSecret = accessToken.Secret
- };
- }
-
- public async Task ProcessApprovedAuthCallbackAsync(RequestToken token)
- {
- if (token == null)
- throw new ArgumentNullException("token", "RequestToken cannot be null");
-
- if (string.IsNullOrWhiteSpace(token.Token))
- throw new ArgumentNullException("token", "RequestToken.Token must not be null");
-
- var oauthRequestToken = new AsyncOAuth.RequestToken(token.Token, token.Secret);
- var authorizer = new OAuthAuthorizer(ConsumerKey, ConsumerSecret);
- var accessToken = await authorizer.GetAccessToken(Constants.BaseApiUrl + Constants.TemporaryCredentialsAccessTokenUri, oauthRequestToken, token.Verifier);
-
- var result = new AuthCredential
- {
- AuthToken = accessToken.Token.Key,
- AuthTokenSecret = accessToken.Token.Secret,
- UserId = accessToken.ExtraData["encoded_user_id"].FirstOrDefault()
- };
- return result;
- }
- }
-}
\ No newline at end of file
diff --git a/OAuth1Migration/Fitbit.OAuth1Migration/Constants.cs b/OAuth1Migration/Fitbit.OAuth1Migration/Constants.cs
deleted file mode 100644
index bf94ba47..00000000
--- a/OAuth1Migration/Fitbit.OAuth1Migration/Constants.cs
+++ /dev/null
@@ -1,28 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace Fitbit.OAuth1Migration
-{
- internal class Constants
- {
- public const string BaseApiUrl = "https://api.fitbit.com/";
- public const string TemporaryCredentialsRequestTokenUri = "oauth/request_token";
- public const string TemporaryCredentialsAccessTokenUri = "oauth/access_token";
- public const string AuthorizeUri = "oauth/authorize";
- public const string LogoutAndAuthorizeUri = "oauth/logout_and_authorize";
-
- public class Headers
- {
- public const string XFitbitSubscriberId = "X-Fitbit-Subscriber-Id";
- }
-
- public class Formatting
- {
- public const string TrailingSlash = "{0}/";
- public const string LeadingDash = "-{0}";
- }
- }
-}
diff --git a/OAuth1Migration/Fitbit.OAuth1Migration/Fitbit.OAuth1Migration.csproj b/OAuth1Migration/Fitbit.OAuth1Migration/Fitbit.OAuth1Migration.csproj
deleted file mode 100644
index 76aaaec2..00000000
--- a/OAuth1Migration/Fitbit.OAuth1Migration/Fitbit.OAuth1Migration.csproj
+++ /dev/null
@@ -1,100 +0,0 @@
-
-
-
-
- Debug
- AnyCPU
- {8FCFBC6C-36B0-4117-814A-2C2EA43F44AC}
- Library
- Properties
- Fitbit.OAuth1Migration
- Fitbit.OAuth1Migration
- v4.5.2
- 512
-
-
- true
- full
- false
- bin\Debug\
- DEBUG;TRACE
- prompt
- 4
-
-
- pdbonly
- true
- bin\Release\
- TRACE
- prompt
- 4
-
-
-
- ..\..\Fitbit\packages\AsyncOAuth.0.8.4\lib\AsyncOAuth.dll
- True
-
-
- ..\..\Fitbit\packages\Fitbit.NET.2.0.020160302.3-RC2-Dev\lib\net451\Fitbit.Portable.dll
- True
-
-
- ..\..\Fitbit\packages\Microsoft.Bcl.Async.1.0.168\lib\net40\Microsoft.Threading.Tasks.dll
- True
-
-
- ..\..\Fitbit\packages\Microsoft.Bcl.Async.1.0.168\lib\net40\Microsoft.Threading.Tasks.Extensions.dll
- True
-
-
- ..\..\Fitbit\packages\Microsoft.Bcl.Async.1.0.168\lib\net40\Microsoft.Threading.Tasks.Extensions.Desktop.dll
- True
-
-
- ..\packages\Newtonsoft.Json.8.0.2\lib\net45\Newtonsoft.Json.dll
- True
-
-
-
-
-
- ..\..\Fitbit\packages\Microsoft.Net.Http.2.2.22\lib\net45\System.Net.Http.Extensions.dll
- True
-
-
- ..\..\Fitbit\packages\Microsoft.Net.Http.2.2.22\lib\net45\System.Net.Http.Primitives.dll
- True
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/OAuth1Migration/Fitbit.OAuth1Migration/FitbitClientOA1Factory.cs b/OAuth1Migration/Fitbit.OAuth1Migration/FitbitClientOA1Factory.cs
deleted file mode 100644
index 49cfa70b..00000000
--- a/OAuth1Migration/Fitbit.OAuth1Migration/FitbitClientOA1Factory.cs
+++ /dev/null
@@ -1,61 +0,0 @@
-using System;
-using System.Net.Http;
-using Fitbit.Api.Portable;
-
-namespace Fitbit.OAuth1Migration
-{
- public static class FitbitClientOA1Factory
- {
- ///
- /// Private base constructor which takes it all and constructs or throws exceptions as appropriately
- ///
- ///
- ///
- ///
- ///
- ///
- public static FitbitClient Create(string consumerKey, string consumerSecret, string accessToken, string accessSecret, IFitbitInterceptor interceptor = null)
- {
-
- #region Parameter checking
- if (string.IsNullOrWhiteSpace(consumerKey))
- {
- throw new ArgumentNullException(nameof(consumerKey), "ConsumerKey must not be empty or null");
- }
-
- if (string.IsNullOrWhiteSpace(consumerSecret))
- {
- throw new ArgumentNullException(nameof(consumerSecret), "ConsumerSecret must not be empty or null");
- }
-
- if (string.IsNullOrWhiteSpace(accessToken))
- {
- throw new ArgumentNullException(nameof(accessToken), "AccessToken must not be empty or null");
- }
-
- if (string.IsNullOrWhiteSpace(accessSecret))
- {
- throw new ArgumentNullException(nameof(accessSecret), "AccessSecret must not be empty or null");
- }
- #endregion
-
- if (interceptor != null)
- {
- return new FitbitClient(mh =>
- {
- //Injecting the Message Handler provided by FitbitClient library (mh) allows us to invoke any IFitbitInterceptor that has been registered
- return AsyncOAuth.OAuthUtility.CreateOAuthClient(mh, consumerKey, consumerSecret,
- new AsyncOAuth.AccessToken(accessToken, accessSecret));
- }, interceptor);
- }
- else
- {
- return new FitbitClient(mh =>
- {
- return AsyncOAuth.OAuthUtility.CreateOAuthClient(consumerKey, consumerSecret,
- new AsyncOAuth.AccessToken(accessToken, accessSecret));
- });
- }
- }
- }
-}
diff --git a/OAuth1Migration/Fitbit.OAuth1Migration/app.config b/OAuth1Migration/Fitbit.OAuth1Migration/app.config
deleted file mode 100644
index 68f34666..00000000
--- a/OAuth1Migration/Fitbit.OAuth1Migration/app.config
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/OAuth1Migration/Fitbit.OAuth1Migration/packages.config b/OAuth1Migration/Fitbit.OAuth1Migration/packages.config
deleted file mode 100644
index 369fe109..00000000
--- a/OAuth1Migration/Fitbit.OAuth1Migration/packages.config
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/SampleConsole/SampleConsole.sln b/SampleConsole/SampleConsole.sln
new file mode 100644
index 00000000..cd7c1e03
--- /dev/null
+++ b/SampleConsole/SampleConsole.sln
@@ -0,0 +1,31 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.28407.52
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SampleConsole", "SampleConsole\SampleConsole.csproj", "{11886EF6-6527-4061-A859-3191F7E3B192}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Fitbit.Portable", "..\Fitbit.Portable\Fitbit.Portable.csproj", "{7BE1498A-7DC8-40B5-97CC-35500D57BDC9}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {11886EF6-6527-4061-A859-3191F7E3B192}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {11886EF6-6527-4061-A859-3191F7E3B192}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {11886EF6-6527-4061-A859-3191F7E3B192}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {11886EF6-6527-4061-A859-3191F7E3B192}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7BE1498A-7DC8-40B5-97CC-35500D57BDC9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {7BE1498A-7DC8-40B5-97CC-35500D57BDC9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7BE1498A-7DC8-40B5-97CC-35500D57BDC9}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {7BE1498A-7DC8-40B5-97CC-35500D57BDC9}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {74C0CAE9-2BAE-4E8F-A0F4-04500430DA15}
+ EndGlobalSection
+EndGlobal
diff --git a/SampleConsole/SampleConsole/App.config b/SampleConsole/SampleConsole/App.config
new file mode 100644
index 00000000..9c99e876
--- /dev/null
+++ b/SampleConsole/SampleConsole/App.config
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/SampleConsole/SampleConsole/AuthorizationHelper.cs b/SampleConsole/SampleConsole/AuthorizationHelper.cs
new file mode 100644
index 00000000..0803490f
--- /dev/null
+++ b/SampleConsole/SampleConsole/AuthorizationHelper.cs
@@ -0,0 +1,143 @@
+using Fitbit.Api.Portable;
+using Fitbit.Api.Portable.OAuth2;
+using OutputColorizer;
+using System;
+using System.Diagnostics;
+using System.IO;
+using System.Net;
+using System.Net.Http;
+using System.Security.Principal;
+using System.Text;
+using System.Threading.Tasks;
+using System.Xml.Serialization;
+
+namespace SampleConsole
+{
+ public static class AuthorizationHelper
+ {
+ public static FitbitClient GetAuthorizedFitBitClient(params string[] scopes)
+ {
+ // try to retrieve the token from disk
+ OAuth2AccessToken token = GetAccessTokenAsync(scopes).Result;
+
+ return new FitbitClient(new FitbitAppCredentials() { ClientId = Options.ClientId, ClientSecret = Options.ClientSecret }, token, true);
+ }
+
+ public static async Task GetAccessTokenAsync(params string[] scopes)
+ {
+ var token = ReadTokenFromDisk();
+ if (token == null || token.UtcExpirationDate < DateTime.Now.ToUniversalTime())
+ {
+ // we need admin to retrieve the token automatically
+ RestartAsElevatedIfNeeded();
+
+ token = await AuthorizeToFitBitAsync(scopes.Length == 0 ? Options.AllScopes : scopes);
+
+ SaveTokenToFile(token);
+ }
+
+ return token;
+ }
+
+ private static void SaveTokenToFile(OAuth2AccessToken token)
+ {
+ try
+ {
+ XmlSerializer ser = new XmlSerializer(typeof(OAuth2AccessToken));
+ using (StreamWriter sw = new StreamWriter("token.dat"))
+ {
+ ser.Serialize(sw, token);
+ }
+ }
+ catch
+ {
+ }
+ }
+
+ private static OAuth2AccessToken ReadTokenFromDisk()
+ {
+ if (!File.Exists("token.dat"))
+ {
+ return null;
+ }
+
+ try
+ {
+ XmlSerializer ser = new XmlSerializer(typeof(OAuth2AccessToken));
+ using (StreamReader sr = new StreamReader("token.dat"))
+ {
+ return ser.Deserialize(sr) as OAuth2AccessToken;
+ }
+ }
+ catch
+ {
+ return null;
+ }
+ }
+
+ private static async Task AuthorizeToFitBitAsync(string[] scopes)
+ {
+ Colorizer.WriteLine("Sending authorization request...");
+ string scope = string.Join("%20", scopes);
+ string authorizeUrl = $"https://www.fitbit.com/oauth2/authorize?response_type=code&client_id={Options.ClientId}&scope={scope}&expires_in=86400";
+ Process.Start(authorizeUrl);
+
+ Colorizer.WriteLine("Waiting for callback at [Yellow!http://localhost]");
+ string code;
+ using (HttpListener listener = new HttpListener())
+ {
+ listener.Prefixes.Add("http://localhost/");
+ listener.Start();
+ HttpListenerContext context = listener.GetContext();
+
+ Colorizer.WriteLine("Request received, retrieving code");
+ HttpListenerRequest request = context.Request;
+
+ //retrieve the code from the raw request.
+ code = request.QueryString["code"];
+ }
+
+ Colorizer.WriteLine("Exchanging code for authentication token");
+ using (HttpClient hc = new HttpClient())
+ {
+ HttpRequestMessage requestMsg = new HttpRequestMessage();
+ requestMsg.Method = HttpMethod.Post;
+ requestMsg.RequestUri = new Uri("https://api.fitbit.com/oauth2/token");
+ string authorizationHeader = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes($"{Options.ClientId}:{Options.ClientSecret}"));
+ requestMsg.Headers.Add("Authorization", "Basic " + authorizationHeader);
+ requestMsg.Content = new StringContent($"client_id={Options.ClientSecret}&grant_type=authorization_code&code={code}", Encoding.ASCII, "application/x-www-form-urlencoded");
+
+ Colorizer.Write("Making request...");
+ using (var responseMsg = await hc.SendAsync(requestMsg))
+ {
+ Colorizer.WriteLine("[Green!done].");
+ if (responseMsg.IsSuccessStatusCode)
+ {
+ var tok = OAuth2Helper.ParseAccessTokenResponse(await responseMsg.Content.ReadAsStringAsync());
+ tok.UtcExpirationDate = DateTime.Now.ToUniversalTime().AddSeconds(tok.ExpiresIn);
+
+ return tok;
+ }
+ }
+ }
+
+ return null;
+ }
+
+ private static void RestartAsElevatedIfNeeded()
+ {
+ // we can't authorize if we are not admin because we require access to register a listener to http://localhost.
+ if (!WindowsIdentity.GetCurrent().Owner.IsWellKnown(WellKnownSidType.BuiltinAdministratorsSid))
+ {
+ // start the same process (as admin)
+ Process elevatedProcess = new Process();
+ elevatedProcess.StartInfo.FileName = System.Reflection.Assembly.GetEntryAssembly().Location;
+ elevatedProcess.StartInfo.Arguments = string.Join(" ", Environment.GetCommandLineArgs()); // pass whatever arguments were passed before.
+ elevatedProcess.StartInfo.Verb = "runas"; //run as admin
+ elevatedProcess.Start();
+
+ Environment.Exit(0);
+ }
+ }
+ }
+}
diff --git a/SampleConsole/SampleConsole/Options.cs b/SampleConsole/SampleConsole/Options.cs
new file mode 100644
index 00000000..2c98cb3a
--- /dev/null
+++ b/SampleConsole/SampleConsole/Options.cs
@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace SampleConsole
+{
+ public class Options
+ {
+ public static string ClientId = System.Configuration.ConfigurationManager.AppSettings["FitbitConsumerKey"];
+ public static string ClientSecret = System.Configuration.ConfigurationManager.AppSettings["FitbitConsumerSecret"];
+ public static string[] AllScopes = new string[] { "activity ", "nutrition ", "heartrate ", "location ", "nutrition ", "profile ", "settings ", "sleep ", "social ", "weight" };
+ }
+}
diff --git a/SampleConsole/SampleConsole/Program.cs b/SampleConsole/SampleConsole/Program.cs
new file mode 100644
index 00000000..ff4c2540
--- /dev/null
+++ b/SampleConsole/SampleConsole/Program.cs
@@ -0,0 +1,37 @@
+using Fitbit.Api.Portable;
+using Fitbit.Models;
+using OutputColorizer;
+using System;
+using System.Collections.Generic;
+using System.IO;
+
+namespace SampleConsole
+{
+ class Program
+ {
+ static void Main(string[] args)
+ {
+ // Authorize with FitBit
+ FitbitClient fc = AuthorizationHelper.GetAuthorizedFitBitClient("activity ", "nutrition ", "heartrate ", "location ", "nutrition ", "profile ", "settings ", "sleep ", "social ", "weight");
+
+ // Retrieve the weight information for today
+ DateTime start = DateTime.Now;
+ Colorizer.WriteLine("Processing [Yellow!{0}]...", start.ToShortDateString());
+
+ var user = fc.GetUserProfileAsync().Result;
+ Colorizer.WriteLine("found [Green!{0}].", user.FullName);
+
+ var weight = fc.GetWeightAsync(start, DateRangePeriod.OneMonth).Result;
+ Colorizer.WriteLine("found [Green!{0}] weight entries.", weight.Weights.Count);
+
+ // Save the downloaded information to disk
+ System.Xml.Serialization.XmlSerializer src = new System.Xml.Serialization.XmlSerializer(typeof(Weight));
+ using (StreamWriter sw = new StreamWriter("weight.txt"))
+ {
+ src.Serialize(sw, weight);
+ }
+
+ Console.ReadKey();
+ }
+ }
+}
diff --git a/OAuth1Migration/Fitbit.OAuth1Migration/Properties/AssemblyInfo.cs b/SampleConsole/SampleConsole/Properties/AssemblyInfo.cs
similarity index 84%
rename from OAuth1Migration/Fitbit.OAuth1Migration/Properties/AssemblyInfo.cs
rename to SampleConsole/SampleConsole/Properties/AssemblyInfo.cs
index fd802a66..aa390a5d 100644
--- a/OAuth1Migration/Fitbit.OAuth1Migration/Properties/AssemblyInfo.cs
+++ b/SampleConsole/SampleConsole/Properties/AssemblyInfo.cs
@@ -5,12 +5,12 @@
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
-[assembly: AssemblyTitle("Fitbit.OAuth1Migration")]
+[assembly: AssemblyTitle("SampleConsole")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("Fitbit.OAuth1Migration")]
-[assembly: AssemblyCopyright("Copyright © 2016")]
+[assembly: AssemblyProduct("SampleConsole")]
+[assembly: AssemblyCopyright("Copyright © 2017")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
@@ -20,7 +20,7 @@
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
-[assembly: Guid("8fcfbc6c-36b0-4117-814a-2c2ea43f44ac")]
+[assembly: Guid("11886ef6-6527-4061-a859-3191f7e3b192")]
// Version information for an assembly consists of the following four values:
//
diff --git a/SampleConsole/SampleConsole/SampleConsole.csproj b/SampleConsole/SampleConsole/SampleConsole.csproj
new file mode 100644
index 00000000..2957de30
--- /dev/null
+++ b/SampleConsole/SampleConsole/SampleConsole.csproj
@@ -0,0 +1,77 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {11886EF6-6527-4061-A859-3191F7E3B192}
+ Exe
+ Properties
+ SampleConsole
+ SampleConsole
+ v4.6.1
+ 512
+ true
+
+
+
+ AnyCPU
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ AnyCPU
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+ ..\packages\Newtonsoft.Json.11.0.2\lib\net45\Newtonsoft.Json.dll
+
+
+ ..\packages\OutputColorizer.1.1.0\lib\net45\OutputColorizer.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {1358d3b4-0698-4003-97eb-b6d489e04138}
+ Fitbit.Portable
+
+
+
+
+
\ No newline at end of file
diff --git a/SampleConsole/SampleConsole/packages.config b/SampleConsole/SampleConsole/packages.config
new file mode 100644
index 00000000..f03423bd
--- /dev/null
+++ b/SampleConsole/SampleConsole/packages.config
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/SampleWebApplication/SampleWebApplication.sln b/SampleWebApplication/SampleWebApplication.sln
new file mode 100644
index 00000000..85cbfbc7
--- /dev/null
+++ b/SampleWebApplication/SampleWebApplication.sln
@@ -0,0 +1,31 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.28407.52
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SampleWebApplication", "SampleWebApplication\SampleWebApplication.csproj", "{61C8AD29-A128-442E-BF0B-539A990B15C7}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Fitbit.Portable", "..\Fitbit.Portable\Fitbit.Portable.csproj", "{175CE4EC-A706-45F0-BCA8-BC909C30E753}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {61C8AD29-A128-442E-BF0B-539A990B15C7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {61C8AD29-A128-442E-BF0B-539A990B15C7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {61C8AD29-A128-442E-BF0B-539A990B15C7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {61C8AD29-A128-442E-BF0B-539A990B15C7}.Release|Any CPU.Build.0 = Release|Any CPU
+ {175CE4EC-A706-45F0-BCA8-BC909C30E753}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {175CE4EC-A706-45F0-BCA8-BC909C30E753}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {175CE4EC-A706-45F0-BCA8-BC909C30E753}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {175CE4EC-A706-45F0-BCA8-BC909C30E753}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {52C8BB3F-098C-485B-AC45-47E7AAE953C1}
+ EndGlobalSection
+EndGlobal
diff --git a/Fitbit.Portable.DebugSite/App_Start/BundleConfig.cs b/SampleWebApplication/SampleWebApplication/App_Start/BundleConfig.cs
similarity index 100%
rename from Fitbit.Portable.DebugSite/App_Start/BundleConfig.cs
rename to SampleWebApplication/SampleWebApplication/App_Start/BundleConfig.cs
diff --git a/Fitbit.Portable.DebugSite/App_Start/FilterConfig.cs b/SampleWebApplication/SampleWebApplication/App_Start/FilterConfig.cs
similarity index 100%
rename from Fitbit.Portable.DebugSite/App_Start/FilterConfig.cs
rename to SampleWebApplication/SampleWebApplication/App_Start/FilterConfig.cs
diff --git a/Fitbit.Portable.DebugSite/App_Start/RouteConfig.cs b/SampleWebApplication/SampleWebApplication/App_Start/RouteConfig.cs
similarity index 100%
rename from Fitbit.Portable.DebugSite/App_Start/RouteConfig.cs
rename to SampleWebApplication/SampleWebApplication/App_Start/RouteConfig.cs
diff --git a/Fitbit.Portable.DebugSite/Content/Site.css b/SampleWebApplication/SampleWebApplication/Content/Site.css
similarity index 100%
rename from Fitbit.Portable.DebugSite/Content/Site.css
rename to SampleWebApplication/SampleWebApplication/Content/Site.css
diff --git a/Fitbit.Portable.DebugSite/Content/bootstrap-theme.css b/SampleWebApplication/SampleWebApplication/Content/bootstrap-theme.css
similarity index 100%
rename from Fitbit.Portable.DebugSite/Content/bootstrap-theme.css
rename to SampleWebApplication/SampleWebApplication/Content/bootstrap-theme.css
diff --git a/Fitbit.Portable.DebugSite/Content/bootstrap-theme.min.css b/SampleWebApplication/SampleWebApplication/Content/bootstrap-theme.min.css
similarity index 100%
rename from Fitbit.Portable.DebugSite/Content/bootstrap-theme.min.css
rename to SampleWebApplication/SampleWebApplication/Content/bootstrap-theme.min.css
diff --git a/Fitbit.Portable.DebugSite/Content/bootstrap.css b/SampleWebApplication/SampleWebApplication/Content/bootstrap.css
similarity index 100%
rename from Fitbit.Portable.DebugSite/Content/bootstrap.css
rename to SampleWebApplication/SampleWebApplication/Content/bootstrap.css
diff --git a/Fitbit.Portable.DebugSite/Content/bootstrap.min.css b/SampleWebApplication/SampleWebApplication/Content/bootstrap.min.css
similarity index 100%
rename from Fitbit.Portable.DebugSite/Content/bootstrap.min.css
rename to SampleWebApplication/SampleWebApplication/Content/bootstrap.min.css
diff --git a/SampleWebMVCOAuth2/Controllers/FitbitController.cs b/SampleWebApplication/SampleWebApplication/Controllers/FitbitController.cs
similarity index 96%
rename from SampleWebMVCOAuth2/Controllers/FitbitController.cs
rename to SampleWebApplication/SampleWebApplication/Controllers/FitbitController.cs
index 75a3be04..dca36903 100644
--- a/SampleWebMVCOAuth2/Controllers/FitbitController.cs
+++ b/SampleWebApplication/SampleWebApplication/Controllers/FitbitController.cs
@@ -12,8 +12,7 @@ namespace SampleWebMVC.Controllers
{
public class FitbitController : Controller
{
- //
- // GET: /Fitbit/
+ public static string[] AllScopes = new string[] { "activity ", "nutrition ", "heartrate ", "location ", "nutrition ", "profile ", "settings ", "sleep ", "social ", "weight" };
public ActionResult Index()
{
@@ -36,9 +35,8 @@ public ActionResult Authorize()
//Provide the App Credentials. You get those by registering your app at dev.fitbit.com
//Configure Fitbit authenticaiton request to perform a callback to this constructor's Callback method
var authenticator = new OAuth2Helper(appCredentials, Request.Url.GetLeftPart(UriPartial.Authority) + "/Fitbit/Callback");
- string[] scopes = new string[] {"profile"};
- string authUrl = authenticator.GenerateAuthUrl(scopes, null);
+ string authUrl = authenticator.GenerateAuthUrl(AllScopes, null);
return Redirect(authUrl);
}
@@ -71,7 +69,7 @@ public async Task RefreshToken()
{
var fitbitClient = GetFitbitClient();
- ViewBag.AccessToken = await fitbitClient.RefreshOAuth2Token();
+ ViewBag.AccessToken = await fitbitClient.RefreshOAuth2TokenAsync();
return View("Callback");
}
diff --git a/Fitbit.Portable.DebugSite/Controllers/HomeController.cs b/SampleWebApplication/SampleWebApplication/Controllers/HomeController.cs
similarity index 100%
rename from Fitbit.Portable.DebugSite/Controllers/HomeController.cs
rename to SampleWebApplication/SampleWebApplication/Controllers/HomeController.cs
diff --git a/Fitbit.Portable.DebugSite/Global.asax b/SampleWebApplication/SampleWebApplication/Global.asax
similarity index 100%
rename from Fitbit.Portable.DebugSite/Global.asax
rename to SampleWebApplication/SampleWebApplication/Global.asax
diff --git a/Fitbit.Portable.DebugSite/Global.asax.cs b/SampleWebApplication/SampleWebApplication/Global.asax.cs
similarity index 80%
rename from Fitbit.Portable.DebugSite/Global.asax.cs
rename to SampleWebApplication/SampleWebApplication/Global.asax.cs
index 4757e792..5edb60b3 100644
--- a/Fitbit.Portable.DebugSite/Global.asax.cs
+++ b/SampleWebApplication/SampleWebApplication/Global.asax.cs
@@ -1,8 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Web;
-using System.Web.Mvc;
+using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
@@ -18,4 +14,4 @@ protected void Application_Start()
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
-}
+}
\ No newline at end of file
diff --git a/Fitbit.Portable.DebugSite/Project_Readme.html b/SampleWebApplication/SampleWebApplication/Project_Readme.html
similarity index 100%
rename from Fitbit.Portable.DebugSite/Project_Readme.html
rename to SampleWebApplication/SampleWebApplication/Project_Readme.html
diff --git a/Fitbit.Portable.DebugSite/Properties/AssemblyInfo.cs b/SampleWebApplication/SampleWebApplication/Properties/AssemblyInfo.cs
similarity index 100%
rename from Fitbit.Portable.DebugSite/Properties/AssemblyInfo.cs
rename to SampleWebApplication/SampleWebApplication/Properties/AssemblyInfo.cs
diff --git a/Fitbit.Portable.DebugSite/Fitbit.Portable.DebugSite.csproj b/SampleWebApplication/SampleWebApplication/SampleWebApplication.csproj
similarity index 54%
rename from Fitbit.Portable.DebugSite/Fitbit.Portable.DebugSite.csproj
rename to SampleWebApplication/SampleWebApplication/SampleWebApplication.csproj
index d644feb8..d1123378 100644
--- a/Fitbit.Portable.DebugSite/Fitbit.Portable.DebugSite.csproj
+++ b/SampleWebApplication/SampleWebApplication/SampleWebApplication.csproj
@@ -11,9 +11,9 @@
{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}
Library
Properties
- SampleWebMVCOAuth2
- SampleWebMVCOAuth2
- v4.5.1
+ SampleWebApplication
+ SampleWebApplication
+ v4.6.1
false
true
44300
@@ -24,6 +24,9 @@
true
+
+
+
true
@@ -43,135 +46,123 @@
4
-
-
- ..\Fitbit\packages\Newtonsoft.Json.8.0.2\lib\net45\Newtonsoft.Json.dll
- True
+
+ ..\packages\Antlr.3.5.0.2\lib\Antlr3.Runtime.dll
-
-
-
-
-
-
-
-
-
-
-
-
- ..\packages\Microsoft.AspNet.Mvc.5.2.2\lib\net45\System.Web.Mvc.dll
- True
+
+ ..\packages\EntityFramework.6.2.0\lib\net45\EntityFramework.dll
-
-
-
-
-
-
- True
- ..\Fitbit\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll
+
+ ..\packages\EntityFramework.6.2.0\lib\net45\EntityFramework.SqlServer.dll
-
+
+ ..\packages\Microsoft.AspNet.Identity.Core.2.2.2\lib\net45\Microsoft.AspNet.Identity.Core.dll
-
+
+ ..\packages\Microsoft.AspNet.Identity.EntityFramework.2.2.2\lib\net45\Microsoft.AspNet.Identity.EntityFramework.dll
-
- True
- ..\Fitbit\packages\Microsoft.AspNet.WebPages.3.2.2\lib\net45\System.Web.Helpers.dll
+
+ ..\packages\Microsoft.AspNet.Identity.Owin.2.2.2\lib\net45\Microsoft.AspNet.Identity.Owin.dll
-
- ..\Fitbit\packages\Microsoft.AspNet.Web.Optimization.1.1.3\lib\net40\System.Web.Optimization.dll
+
+
+ ..\packages\Microsoft.Owin.4.0.0\lib\net451\Microsoft.Owin.dll
-
- True
- ..\Fitbit\packages\Microsoft.AspNet.Razor.3.2.2\lib\net45\System.Web.Razor.dll
+
+ ..\packages\Microsoft.Owin.Host.SystemWeb.4.0.0\lib\net451\Microsoft.Owin.Host.SystemWeb.dll
-
- True
- ..\Fitbit\packages\Microsoft.AspNet.WebPages.3.2.2\lib\net45\System.Web.WebPages.dll
+
+ ..\packages\Microsoft.Owin.Security.4.0.0\lib\net451\Microsoft.Owin.Security.dll
-
- True
- ..\Fitbit\packages\Microsoft.AspNet.WebPages.3.2.2\lib\net45\System.Web.WebPages.Deployment.dll
+
+ ..\packages\Microsoft.Owin.Security.Cookies.4.0.0\lib\net451\Microsoft.Owin.Security.Cookies.dll
-
- True
- ..\Fitbit\packages\Microsoft.AspNet.WebPages.3.2.2\lib\net45\System.Web.WebPages.Razor.dll
+
+