<!-- @license Copyright (c) 2014 The Polymer Project Authors. All rights reserved. This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as part of the polymer project is also subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt --><script>(function () { function resolve() { document.body.removeAttribute('unresolved'); } if (window.WebComponents) { addEventListener('WebComponentsReady', resolve); } else { if (document.readyState === 'interactive' || document.readyState === 'complete') { resolve(); } else { addEventListener('DOMContentLoaded', resolve); } } }()); window.Polymer = { Settings: function () { var user = window.Polymer || {}; location.search.slice(1).split('&').forEach(function (o) { o = o.split('='); o[0] && (user[o[0]] = o[1] || true); }); var wantShadow = user.dom === 'shadow'; var hasShadow = Boolean(Element.prototype.createShadowRoot); var nativeShadow = hasShadow && !window.ShadowDOMPolyfill; var useShadow = wantShadow && hasShadow; var hasNativeImports = Boolean('import' in document.createElement('link')); var useNativeImports = hasNativeImports; var useNativeCustomElements = !window.CustomElements || window.CustomElements.useNative; return { wantShadow: wantShadow, hasShadow: hasShadow, nativeShadow: nativeShadow, useShadow: useShadow, useNativeShadow: useShadow && nativeShadow, useNativeImports: useNativeImports, useNativeCustomElements: useNativeCustomElements }; }() }; (function () { var userPolymer = window.Polymer; window.Polymer = function (prototype) { if (typeof prototype === 'function') { prototype = prototype.prototype; } if (!prototype) { prototype = {}; } var factory = desugar(prototype); prototype = factory.prototype; var options = { prototype: prototype }; if (prototype.extends) { options.extends = prototype.extends; } Polymer.telemetry._registrate(prototype); document.registerElement(prototype.is, options); return factory; }; var desugar = function (prototype) { var base = Polymer.Base; if (prototype.extends) { base = Polymer.Base._getExtendedPrototype(prototype.extends); } prototype = Polymer.Base.chainObject(prototype, base); prototype.registerCallback(); return prototype.constructor; }; window.Polymer = Polymer; if (userPolymer) { for (var i in userPolymer) { Polymer[i] = userPolymer[i]; } } Polymer.Class = desugar; }()); Polymer.telemetry = { registrations: [], _regLog: function (prototype) { console.log('[' + prototype.is + ']: registered'); }, _registrate: function (prototype) { this.registrations.push(prototype); Polymer.log && this._regLog(prototype); }, dumpRegistrations: function () { this.registrations.forEach(this._regLog); } }; Object.defineProperty(window, 'currentImport', { enumerable: true, configurable: true, get: function () { return (document._currentScript || document.currentScript).ownerDocument; } }); Polymer.RenderStatus = { _ready: false, _callbacks: [], whenReady: function (cb) { if (this._ready) { cb(); } else { this._callbacks.push(cb); } }, _makeReady: function () { this._ready = true; this._callbacks.forEach(function (cb) { cb(); }); this._callbacks = []; }, _catchFirstRender: function () { requestAnimationFrame(function () { Polymer.RenderStatus._makeReady(); }); } }; if (window.HTMLImports) { HTMLImports.whenReady(function () { Polymer.RenderStatus._catchFirstRender(); }); } else { Polymer.RenderStatus._catchFirstRender(); } Polymer.ImportStatus = Polymer.RenderStatus; Polymer.ImportStatus.whenLoaded = Polymer.ImportStatus.whenReady; Polymer.Base = { __isPolymerInstance__: true, _addFeature: function (feature) { this.extend(this, feature); }, registerCallback: function () { this._desugarBehaviors(); this._doBehavior('beforeRegister'); this._registerFeatures(); this._doBehavior('registered'); }, createdCallback: function () { Polymer.telemetry.instanceCount++; this.root = this; this._doBehavior('created'); this._initFeatures(); }, attachedCallback: function () { Polymer.RenderStatus.whenReady(function () { this.isAttached = true; this._doBehavior('attached'); }.bind(this)); }, detachedCallback: function () { this.isAttached = false; this._doBehavior('detached'); }, attributeChangedCallback: function (name) { this._attributeChangedImpl(name); this._doBehavior('attributeChanged', arguments); }, _attributeChangedImpl: function (name) { this._setAttributeToProperty(this, name); }, extend: function (prototype, api) { if (prototype && api) { Object.getOwnPropertyNames(api).forEach(function (n) { this.copyOwnProperty(n, api, prototype); }, this); } return prototype || api; }, mixin: function (target, source) { for (var i in source) { target[i] = source[i]; } return target; }, copyOwnProperty: function (name, source, target) { var pd = Object.getOwnPropertyDescriptor(source, name); if (pd) { Object.defineProperty(target, name, pd); } }, _log: console.log.apply.bind(console.log, console), _warn: console.warn.apply.bind(console.warn, console), _error: console.error.apply.bind(console.error, console), _logf: function () { return this._logPrefix.concat([this.is]).concat(Array.prototype.slice.call(arguments, 0)); } }; Polymer.Base._logPrefix = function () { var color = window.chrome || /firefox/i.test(navigator.userAgent); return color ? [ '%c[%s::%s]:', 'font-weight: bold; background-color:#EEEE00;' ] : ['[%s::%s]:']; }(); Polymer.Base.chainObject = function (object, inherited) { if (object && inherited && object !== inherited) { if (!Object.__proto__) { object = Polymer.Base.extend(Object.create(inherited), object); } object.__proto__ = inherited; } return object; }; Polymer.Base = Polymer.Base.chainObject(Polymer.Base, HTMLElement.prototype); if (window.CustomElements) { Polymer.instanceof = CustomElements.instanceof; } else { Polymer.instanceof = function (obj, ctor) { return obj instanceof ctor; }; } Polymer.isInstance = function (obj) { return Boolean(obj && obj.__isPolymerInstance__); }; Polymer.telemetry.instanceCount = 0; (function () { var modules = {}; var lcModules = {}; var findModule = function (id) { return modules[id] || lcModules[id.toLowerCase()]; }; var DomModule = function () { return document.createElement('dom-module'); }; DomModule.prototype = Object.create(HTMLElement.prototype); Polymer.Base.extend(DomModule.prototype, { constructor: DomModule, createdCallback: function () { this.register(); }, register: function (id) { var id = id || this.id || this.getAttribute('name') || this.getAttribute('is'); if (id) { this.id = id; modules[id] = this; lcModules[id.toLowerCase()] = this; } }, import: function (id, selector) { if (id) { var m = findModule(id); if (!m) { forceDocumentUpgrade(); m = findModule(id); } if (m && selector) { m = m.querySelector(selector); } return m; } } }); var cePolyfill = window.CustomElements && !CustomElements.useNative; document.registerElement('dom-module', DomModule); function forceDocumentUpgrade() { if (cePolyfill) { var script = document._currentScript || document.currentScript; var doc = script && script.ownerDocument || document; if (doc) { CustomElements.upgradeAll(doc); } } } }()); Polymer.Base._addFeature({ _prepIs: function () { if (!this.is) { var module = (document._currentScript || document.currentScript).parentNode; if (module.localName === 'dom-module') { var id = module.id || module.getAttribute('name') || module.getAttribute('is'); this.is = id; } } if (this.is) { this.is = this.is.toLowerCase(); } } }); Polymer.Base._addFeature({ behaviors: [], _desugarBehaviors: function () { if (this.behaviors.length) { this.behaviors = this._desugarSomeBehaviors(this.behaviors); } }, _desugarSomeBehaviors: function (behaviors) { behaviors = this._flattenBehaviorsList(behaviors); for (var i = behaviors.length - 1; i >= 0; i--) { this._mixinBehavior(behaviors[i]); } return behaviors; }, _flattenBehaviorsList: function (behaviors) { var flat = []; behaviors.forEach(function (b) { if (b instanceof Array) { flat = flat.concat(this._flattenBehaviorsList(b)); } else if (b) { flat.push(b); } else { this._warn(this._logf('_flattenBehaviorsList', 'behavior is null, check for missing or 404 import')); } }, this); return flat; }, _mixinBehavior: function (b) { Object.getOwnPropertyNames(b).forEach(function (n) { switch (n) { case 'hostAttributes': case 'registered': case 'properties': case 'observers': case 'listeners': case 'created': case 'attached': case 'detached': case 'attributeChanged': case 'configure': case 'ready': break; default: if (!this.hasOwnProperty(n)) { this.copyOwnProperty(n, b, this); } break; } }, this); }, _prepBehaviors: function () { this._prepFlattenedBehaviors(this.behaviors); }, _prepFlattenedBehaviors: function (behaviors) { for (var i = 0, l = behaviors.length; i < l; i++) { this._prepBehavior(behaviors[i]); } this._prepBehavior(this); }, _doBehavior: function (name, args) { this.behaviors.forEach(function (b) { this._invokeBehavior(b, name, args); }, this); this._invokeBehavior(this, name, args); }, _invokeBehavior: function (b, name, args) { var fn = b[name]; if (fn) { fn.apply(this, args || Polymer.nar); } }, _marshalBehaviors: function () { this.behaviors.forEach(function (b) { this._marshalBehavior(b); }, this); this._marshalBehavior(this); } }); Polymer.Base._addFeature({ _getExtendedPrototype: function (tag) { return this._getExtendedNativePrototype(tag); }, _nativePrototypes: {}, _getExtendedNativePrototype: function (tag) { var p = this._nativePrototypes[tag]; if (!p) { var np = this.getNativePrototype(tag); p = this.extend(Object.create(np), Polymer.Base); this._nativePrototypes[tag] = p; } return p; }, getNativePrototype: function (tag) { return Object.getPrototypeOf(document.createElement(tag)); } }); Polymer.Base._addFeature({ _prepConstructor: function () { this._factoryArgs = this.extends ? [ this.extends, this.is ] : [this.is]; var ctor = function () { return this._factory(arguments); }; if (this.hasOwnProperty('extends')) { ctor.extends = this.extends; } Object.defineProperty(this, 'constructor', { value: ctor, writable: true, configurable: true }); ctor.prototype = this; }, _factory: function (args) { var elt = document.createElement.apply(document, this._factoryArgs); if (this.factoryImpl) { this.factoryImpl.apply(elt, args); } return elt; } }); Polymer.nob = Object.create(null); Polymer.Base._addFeature({ properties: {}, getPropertyInfo: function (property) { var info = this._getPropertyInfo(property, this.properties); if (!info) { this.behaviors.some(function (b) { return info = this._getPropertyInfo(property, b.properties); }, this); } return info || Polymer.nob; }, _getPropertyInfo: function (property, properties) { var p = properties && properties[property]; if (typeof p === 'function') { p = properties[property] = { type: p }; } if (p) { p.defined = true; } return p; } }); Polymer.CaseMap = { _caseMap: {}, dashToCamelCase: function (dash) { var mapped = Polymer.CaseMap._caseMap[dash]; if (mapped) { return mapped; } if (dash.indexOf('-') < 0) { return Polymer.CaseMap._caseMap[dash] = dash; } return Polymer.CaseMap._caseMap[dash] = dash.replace(/-([a-z])/g, function (m) { return m[1].toUpperCase(); }); }, camelToDashCase: function (camel) { var mapped = Polymer.CaseMap._caseMap[camel]; if (mapped) { return mapped; } return Polymer.CaseMap._caseMap[camel] = camel.replace(/([a-z][A-Z])/g, function (g) { return g[0] + '-' + g[1].toLowerCase(); }); } }; Polymer.Base._addFeature({ _prepAttributes: function () { this._aggregatedAttributes = {}; }, _addHostAttributes: function (attributes) { if (attributes) { this.mixin(this._aggregatedAttributes, attributes); } }, _marshalHostAttributes: function () { this._applyAttributes(this, this._aggregatedAttributes); }, _applyAttributes: function (node, attr$) { for (var n in attr$) { if (!this.hasAttribute(n) && n !== 'class') { this.serializeValueToAttribute(attr$[n], n, this); } } }, _marshalAttributes: function () { this._takeAttributesToModel(this); }, _takeAttributesToModel: function (model) { for (var i = 0, l = this.attributes.length; i < l; i++) { this._setAttributeToProperty(model, this.attributes[i].name); } }, _setAttributeToProperty: function (model, attrName) { if (!this._serializing) { var propName = Polymer.CaseMap.dashToCamelCase(attrName); var info = this.getPropertyInfo(propName); if (info.defined || this._propertyEffects && this._propertyEffects[propName]) { var val = this.getAttribute(attrName); model[propName] = this.deserialize(val, info.type); } } }, _serializing: false, reflectPropertyToAttribute: function (name) { this._serializing = true; this.serializeValueToAttribute(this[name], Polymer.CaseMap.camelToDashCase(name)); this._serializing = false; }, serializeValueToAttribute: function (value, attribute, node) { var str = this.serialize(value); (node || this)[str === undefined ? 'removeAttribute' : 'setAttribute'](attribute, str); }, deserialize: function (value, type) { switch (type) { case Number: value = Number(value); break; case Boolean: value = value !== null; break; case Object: try { value = JSON.parse(value); } catch (x) { } break; case Array: try { value = JSON.parse(value); } catch (x) { value = null; console.warn('Polymer::Attributes: couldn`t decode Array as JSON'); } break; case Date: value = new Date(value); break; case String: default: break; } return value; }, serialize: function (value) { switch (typeof value) { case 'boolean': return value ? '' : undefined; case 'object': if (value instanceof Date) { return value; } else if (value) { try { return JSON.stringify(value); } catch (x) { return ''; } } default: return value != null ? value : undefined; } } }); Polymer.Base._addFeature({ _setupDebouncers: function () { this._debouncers = {}; }, debounce: function (jobName, callback, wait) { return this._debouncers[jobName] = Polymer.Debounce.call(this, this._debouncers[jobName], callback, wait); }, isDebouncerActive: function (jobName) { var debouncer = this._debouncers[jobName]; return debouncer && debouncer.finish; }, flushDebouncer: function (jobName) { var debouncer = this._debouncers[jobName]; if (debouncer) { debouncer.complete(); } }, cancelDebouncer: function (jobName) { var debouncer = this._debouncers[jobName]; if (debouncer) { debouncer.stop(); } } }); Polymer.version = '1.2.0'; Polymer.Base._addFeature({ _registerFeatures: function () { this._prepIs(); this._prepAttributes(); this._prepBehaviors(); this._prepConstructor(); }, _prepBehavior: function (b) { this._addHostAttributes(b.hostAttributes); }, _marshalBehavior: function (b) { }, _initFeatures: function () { this._marshalHostAttributes(); this._setupDebouncers(); this._marshalBehaviors(); } });</script>