[{"data":1,"prerenderedAt":3494},["ShallowReactive",2],{"search-index-blog":3,"blog-\u002Fblog\u002Fgoogle-picker-with-drive":917,"surround-\u002Fblog\u002Fgoogle-picker-with-drive":3489},[4,11,19,24,30,35,41,46,52,57,62,67,72,78,84,90,95,101,107,113,118,125,130,135,141,146,151,156,163,168,174,179,185,190,195,200,205,210,215,221,226,231,236,241,246,251,256,261,266,272,277,282,287,293,298,304,309,314,319,325,330,335,340,345,351,356,363,368,373,378,384,389,394,399,405,410,415,420,426,432,437,443,448,454,459,464,469,474,480,485,490,495,500,505,510,515,521,526,531,537,542,547,552,557,562,567,573,579,584,589,594,599,604,609,614,620,625,630,635,640,645,651,656,661,666,671,676,682,687,692,697,702,707,712,719,724,729,734,739,745,750,755,760,765,770,775,780,786,791,797,802,808,813,818,823,829,834,839,844,849,854,860,865,871,876,881,886,891,896,901,906,912],{"title":5,"path":6,"description":7,"tags":8},"ADOBE ILLUSTRATOR SHORTCUTS","\u002Fblog\u002Fadobe-illustrator-shortcuts","Here are 26 Adobe Illustrator shortcuts that can help you to speed up productivity. I use most of them (in fact, I can’t work without them). Most of shortcuts listed in this article aren’t documented in the software, so keep reading and you’re sure to find at least one new trick to put up your sleeve. Enjoy!",[9,10],"design","illustrator",{"title":12,"path":13,"description":14,"tags":15},"ANGULAR CONTROLLERS SHARE STATE","\u002Fblog\u002Fangular-controllers-share-state","When your Angular.js application expands to a state that you no longer find it easy to understand, it's time you used dependency injection and modularise your application into units of interrelated modules.",[16,17,18],"development","javascript","angular.js",{"title":20,"path":21,"description":22,"tags":23},"ANGULAR TRANSLATE","\u002Fblog\u002Fangular-translate","Angular Translate is an AngularJS module called angular-translate which makes i18n and l10n easier with your Angular application. The acronym i18n stands for internationalization, and l10n for localization.",[16,17,18],{"title":25,"path":26,"description":27,"tags":28},"ANIMATION SPEED IN JAVASCRIPT AND CSS","\u002Fblog\u002Fanimation-speed-in-javascript-and-css","In this article, we go through how JavaScript-based DOM animation libraries, such as Velocity.js and GSAP, are more efficient than jQuery and CSS-based animation libraries. We will discuss how those libraries work, where to use them and what other alternatives are out there for animation.",[16,17,29],"css",{"title":31,"path":32,"description":33,"tags":34},"ARRAY COMPREHENSIONS","\u002Fblog\u002Farray-comprehensions","Array comprehension is creating a list B based on another list A, where each entry of B is the result of a custom operation performed on the items of list A.",[16,17],{"title":36,"path":37,"description":38,"tags":39},"ASYNCHRONOUS JAVASCRIPT WITH ASYNC\u002FAWAIT","\u002Fblog\u002Fasynchronous-javascript-asyncawait","'Promises are great but the its nested syntax can get easily complex and hard to follow.",[16,17,40],"react",{"title":42,"path":43,"description":44,"tags":45},"BABEL & WEBPACK","\u002Fblog\u002Fbabel-webpack","Babel has been one of the big newcomers of JavaScript community in 2015. It allows us to use features from the future of JavaScript. It will transform your futuristic code into a format, browsers understand. You can even use it to develop your own language features. Babel’s built-in JSX support will come in handy here.",[16,17],{"title":47,"path":48,"description":49,"tags":50},"BACKBONE CUSTOMIZING COLLECTIONS","\u002Fblog\u002Fbackbone-customizing-collections","Backbone collections are an ordered set of models, which only use one type of model. Customizing these collections can help your Backbone application to leverage data the way you want.",[16,17,51],"backbone.js",{"title":53,"path":54,"description":55,"tags":56},"BACKBONE – MODELS","\u002Fblog\u002Fbackbone-models","Models are the heart of any JavaScript MVC application, containing the interactive data as well as a large part of the logic surrounding it: conversions, validations, computed properties, and access control.",[16,17,51],{"title":58,"path":59,"description":60,"tags":61},"BACKBONE PATTERNS","\u002Fblog\u002Fbackbone-patterns","In this article, we’ll discuss different patterns that you can use with popular open-source JavaScript MV* framework, Backbone.js.  Developers run into problems when they first use Backbone.js as it provides structure to the application leaving the developer to make decisions on design petterns.",[16,17,51],{"title":63,"path":64,"description":65,"tags":66},"BACKBONE- ROUTERS","\u002Fblog\u002Fbackbone-routers","In the traditional MVC sense Routers don’t necessarily fit the semantics. Though a Backbone \"router\" is still very useful for any application\u002Ffeature that needs URL routing\u002Fhistory capabilities. Backbone routers are used for routing your applications URL’s when using hash tags(#).",[16,17,51],{"title":68,"path":69,"description":70,"tags":71},"BEM","\u002Fblog\u002Fbem","BEM stands for Block, Element, Modifier. BEM is a stricter standard for naming CSS classes for larger projects, where standards need to be enforced. BEM helps scale your project, and add meaning to your CSS. Therefore it is valuable to understand this convention.",[16,29],{"title":73,"path":74,"description":75,"tags":76},"BENEFITS OF AUTOMATED DEPLOYMENT","\u002Fblog\u002Fbenefits-of-automated-deployment","When deploying software manually, the tendancy is to deploy once a month or perhaps once every two or three months. Deployment doesn’t stop for production only, there are test, staging and production as well.",[16,77],"deployment",{"title":79,"path":80,"description":81,"tags":82},"BROWSERSYNC & GULP","\u002Fblog\u002Fbrowsersync-gulp","BrowserSync & Gulp are a two very useful combination when it comes to developing applications efficiently, without having to refresh the web page every time you make a change. Let’s look at what BrowserSync & Gulp are, and how to install and use them.",[16,17,83],"gulp",{"title":85,"path":86,"description":87,"tags":88},"CHROMATIC ABERRATION","\u002Fblog\u002Fchromatic-aberration","In optical lenses, chromatic aberration (also known as achromatism or chromatic distortion) is a type of  distortion in which there is a failure of a lens to focus all colors to the same convergence point.",[89],"photography",{"title":91,"path":92,"description":93,"tags":94},"CHROME DEVTOOLS FOR WEB APP DEVELOPERS","\u002Fblog\u002Fchrome-devtools-web-app-developers","The Chrome DevTools (Developer Tools), are a set web authoring and debugging tools built into Google Chrome. The DevTools provide web developers deep access into the internals of the browser and their web application. ",[16,17],{"title":96,"path":97,"description":98,"tags":99},"COFFEESCRIPT INTRODUCTION","\u002Fblog\u002Fcoffeescript-introduction","CoffeeScript is a language that makes JavaScript easier to write and read. It simplifies JavaScript, making it readable and understandable, as well easier to maintain. CoffeeScript compiles into JavaScript",[16,17,100],"coffeescript",{"title":102,"path":103,"description":104,"tags":105},"COFFEESCRIPT – JQUERY","\u002Fblog\u002Fcoffeescript-jquery","Writing jQuery in CoffeeScript, further simplifies the syntax. The jQuery(function($)) can be written as jQuery($) -> or simply $ ->.",[16,17,106,100],"jquery",{"title":108,"path":109,"description":110,"tags":111},"CONTENT AWARE SCALING IN PHOTOSHOP","\u002Fblog\u002Fcontent-aware-scaling-in-photoshop","In Photoshop CS6, content-aware scaling (also known as seam carving) is a cool image-sizing feature.",[9,112],"photoshop",{"title":114,"path":115,"description":116,"tags":117},"CREATE FAVICONS IN PHOTOSHOP","\u002Fblog\u002Fcreate-favicons-in-photoshop","'Having a favicon for your site helps users to find your web site on a bookmarks bar, or among open tabs.",[9,112],{"title":119,"path":120,"description":121,"tags":122},"CREATE A RAILS 5 API APPLICATION","\u002Fblog\u002Fcreate-rails-5-api-application","'Rails 5 ships a new gem rails-api which makes building API only rails apps a breeze.",[16,123,124],"rails","ruby",{"title":126,"path":127,"description":128,"tags":129},"CSS – CLEARING FLOATS","\u002Fblog\u002Fcss-clearing-floats","A common problem with float-based layouts is that the floats' container doesn't want to stretch up to accommodate the floats. If you want to add, say, a border around all floats (ie. a border around the container) you'll have to command the browsers somehow to stretch up the container all the way.",[16,17],{"title":131,"path":132,"description":133,"tags":134},"CSS INTRODUCTION","\u002Fblog\u002Fcss-introduction","Cascading Style Sheets (CSS) is a style sheet language used for describing the look and formatting of a document written in a markup language, most often used to change the style of web pages written in HTML. CSS is designed primarily to enable the separation of document content from document presentation, including elements such as the layout, colors, and fonts.",[16,29],{"title":136,"path":137,"description":138,"tags":139},"CSS MODULES","\u002Fblog\u002Fcss-modules","A CSS Module is a CSS file in which all class names and animation names are scoped locally by default, eleminating the problems with global nature of the CSS namespace.",[16,17,29,140],"react.js",{"title":142,"path":143,"description":144,"tags":145},"CSS3 MEDIA QUERIES","\u002Fblog\u002Fcss3-media-queries","When you are designing your responisve layout for mobile devices, CSS3 media queries are an essential component on your stylesheets. Let’s discuss how they work and what min-with and max-with work together.",[16,29],{"title":147,"path":148,"description":149,"tags":150},"DEFERRED AND PROMISE IN JQUERY","\u002Fblog\u002Fdeferred-and-promise-in-jquery","Deferred and promise are part of jQuery since version 1.5 and they help in handling asynchronous functions like Ajax.",[16,17,106],{"title":152,"path":153,"description":154,"tags":155},"DEPLOYING ASP.NET MVC APPLICATIONS","\u002Fblog\u002Fdeploying-aspnet-mvc-applications","In a continuous integration environment, deploying ASP.NET MVC applications are done by a click of a button, triggered by a check-in, and then  many moving parts of the integration service will take care of distributing the artifacts to the relevant  servers. But here we are discussing about how to get your ASP.NET code to be tested on a local IIS server environment. So let’s start with dependancies, and what needs to be included with the deployment.",[16,17],{"title":157,"path":158,"description":159,"tags":160},"DEVELOP MOBILE APPS WITH PHONEGAP","\u002Fblog\u002Fdevelop-mobile-apps-phonegap","PhoneGap is a web-based mobile development framework based on opened source Cordova project, which allows you to create app store ready mobile applications. PhoneGap allows you to use web technologies such as HTML, CSS and JavaScript for cross platform development. It was created by Nitobi in 2009. In 2011, Nitobi was bought by Adobe, and PhoneGap was donated to Apache Foundation, and PhoneGap was renamed to Cordova.",[16,161,17,162],"mobile","phonegap",{"title":164,"path":165,"description":166,"tags":167},"DODGE BURN AND SPONGE TOOLS IN PHOTOSHOP CS6","\u002Fblog\u002Fdodge-burn-and-sponge-tools-in-photoshop-cs6","The Dodge, Burn, and Sponge tools in Photoshop CS 6 can be used to correct the lighting of an image. Let’s look at each of these tools and what they are useful for.",[9,89,112],{"title":169,"path":170,"description":171,"tags":172},"EMBER & HANDLEBARS","\u002Fblog\u002Fember-handlebars","Before getting into handlebars, let's look at how routing works in Ember.js. Router is solely responsible for all URLs in Ember.",[16,17,173],"ember.js",{"title":175,"path":176,"description":177,"tags":178},"EMBER – RESOURCE ROUTES","\u002Fblog\u002Fember-resource-routes","The difference between resource() and route() in Ember.js is that you should use this.resource for URLs that represent a noun, and this.route for URLs that represent adjectives or verbs modifying those nouns.",[16,17,173],{"title":180,"path":181,"description":182,"tags":183},"ENTITY FRAMEWORK CODE FIRST","\u002Fblog\u002Fentity-framework-code-first","Entity Framework introduced Code First approach from Entity Framework 4.1. This tutorial covers all the features of Entity Framework Code-First. We will start with the basics of code-first and then we will see how we can configure one-to-one, one-to-many and many-to-many relationship with DataAnnotation as well as Fluent API.",[16,184],"csharp",{"title":186,"path":187,"description":188,"tags":189},"ES2020 New Features","\u002Fblog\u002Fes2020-new-features","Since ES2015, updates from the TC39 committee are released annually. Their latest release ES2020 comes with many new features.",[16,17],{"title":191,"path":192,"description":193,"tags":194},"ES6 ADVANCED FEATURES","\u002Fblog\u002Fes6-advanced-features","We have learned about the new features ES6 brings us in ES6 New Features article. In this post, we will go through the advanced features of ES6 and how we can implement them.",[16,17],{"title":196,"path":197,"description":198,"tags":199},"ES6 ARROW FUNCTIONS","\u002Fblog\u002Fes6-arrow-functions","Arrow functionss are a function shorthand using the => syntax (fat arrow). They are syntactically similar to the related feature in C#, Java 8 and CoffeeScript. They support both expression and statement bodies. Unlike functions, arrows share the same lexical this as their surrounding code.",[16,17],{"title":201,"path":202,"description":203,"tags":204},"ES6 CLASSES","\u002Fblog\u002Fes6-classes","JavaScript classes are simply syntactic sugar over existing JavaScript prototype chain. But classes give you a cleaner way to organise your code, and make it slightly easier for the beginner or people who are familiar with class oriented languages to read JS and understand.",[16,17],{"title":206,"path":207,"description":208,"tags":209},"ES6 DEFAULT, REST & SPREAD","\u002Fblog\u002Fes6-default-rest-spread","Many programming languages support the concept of a default argument for a function parameter so that the caller does not always need to specify the argument value. Unfortunately, ES5 does not have a default argument support in its syntax. ES6 functions have come a long way by taking aboard the years of complaints and improving parameter handling that is less error-prone and more powerful.",[16,17],{"title":211,"path":212,"description":213,"tags":214},"ES6 DESTRUCTURING","\u002Fblog\u002Fes6-destructuring","The destructuring assignment syntax is a JavaScript expression in ES6 that makes it possible to extract data from arrays or objects using a syntax that mirrors the construction of array and object literals.",[16,17],{"title":216,"path":217,"description":218,"tags":219},"ES6 GENERATORS","\u002Fblog\u002Fes6-generators","ES6 generators are functions that can be paused or resumed, and work cooperatively in a multitasking applications.",[16,17,220],"es6",{"title":222,"path":223,"description":224,"tags":225},"ES6 ITERATORS & FOR..OF","\u002Fblog\u002Fes6-iterators-for-of","To loop over an array or a collection JavaScript has been traditionally using for loops. ES5 introduced the for ..each loop. But ES6 introduces a little shorter version, a new interface for iteration called Iterable.",[16,17],{"title":227,"path":228,"description":229,"tags":230},"ES6 LET & CONST","\u002Fblog\u002Fes6-let-const","If you are familiar with JavaScript, you have probably known the term scope. If you are familiar with other languages, you would know that a scope of a variable is to the nearest block – block scope. But JavaScript is different. A variable created with var will be scoped to the nearest parent function.",[16,17],{"title":232,"path":233,"description":234,"tags":235},"ES6 MODULES","\u002Fblog\u002Fes6-modules","A module is a self-contained unit of code, which is usually stored in a file. In ES6, modules get language-level support for component definition. Modules export values, which can then be imported by other modules.",[16,17],{"title":237,"path":238,"description":239,"tags":240},"ES6 NEW FEATURES","\u002Fblog\u002Fes6-new-features","Arrows are a function shorthand using the => syntax (‘fat arrow’). They are syntactically similar to the related feature in C#, Java 8 and CoffeeScript. They support both expression and statement bodies. Unlike functions, arrows share the same lexical this as their surrounding code.",[16,17],{"title":242,"path":243,"description":244,"tags":245},"WEB APPLICATION SECURITY","\u002Fblog\u002Fes6-parameter-handling","ES6 introduced improved parameter handling in JavaScript. Instead of the half array arguments object, these new improvements will significantly improve how we handle arguments and parameters.",[16,17,220],{"title":247,"path":248,"description":249,"tags":250},"ES6 RECURSION WITH FUNCTIONAL PROGRAMMING","\u002Fblog\u002Fes6-recursion-with-functional-programming","In this article, we are going to use ES6 recursion with functional programming to understand how we can implement list operations like map, reduce, filter and join.",[16,17,220],{"title":252,"path":253,"description":254,"tags":255},"ES6 SYMBOLS","\u002Fblog\u002Fes6-symbols","Symbols are a new primitive type in ES6. If you ask me, they’re an awful lot like strings. They are tokens that serve as unique IDs. They will help avoid name clashes between properties.",[16,17],{"title":257,"path":258,"description":259,"tags":260},"ES6 TEMPLATE STRINGS","\u002Fblog\u002Fes6-template-strings","Template strings in JavaScript consist of literal text, and placeholders where the runtime can evaluate an expression to inject data into the text.",[16,17],{"title":262,"path":263,"description":264,"tags":265},"ESLINT","\u002Fblog\u002Feslint","ESLint is a pattern identifying and reporting tool for JavaScript code. Somewhat it is similar to JSLint and JSHint with few differences.",[16,17],{"title":267,"path":268,"description":269,"tags":270},"EXT JS DEVELOPING RESPONSIVE APPLICATIONS","\u002Fblog\u002Fext-js-developing-responsive-applications","Creating responsive web applications have been made easier with the arrival of the new JavaScript Framework Ext JS 5. In this article let's look at how we can use responsiveConfig to implement this feature.",[16,17,271],"ext.js",{"title":273,"path":274,"description":275,"tags":276},"EXT.JS – INTRODUCTION","\u002Fblog\u002Fext-js-introduction","Ext JS is a product of Sencha. Ext JS is the industry’s most powerful desktop application development platform with unparalleled cross-browser compatibility, advanced MVC architecture, plugin-free charting, and modern UI widgets.",[16,17,271],{"title":278,"path":279,"description":280,"tags":281},"FETCH API","\u002Fblog\u002Ffetch-api","The Fetch API is a Promise-based standard for performing AJAX requests. It provides a fetch method which returns a Promise on the window object, which we can use to perform requests from remote resources.",[16,17],{"title":283,"path":284,"description":285,"tags":286},"FOCAL LENGTH AND F-STOP","\u002Fblog\u002Ffocal-length-f-stop","Very simply, focal-length is the distance from the lens to the film, when focused on a subject at infinity. In other words, focal length equals image distance for a far subject. To focus on something closer than infinity, the lens is moved farther away from the film or sensor. This is why most lenses get longer when you turn the focusing ring.",[89],{"title":288,"path":289,"description":290,"tags":291},"FOUNDATION 5 NEW FEATURES","\u002Fblog\u002Ffoundation-5-new-features","ZURB’s Foundation framework is a feature-rich, easy to implement,  light weight framework for designing responsive web applications. Designed with mobile-first approach in mind,  it comes packed with CSS3 media queries, The Grid, reusable HTML5 components and several jQuery plugins to aid interactivity.",[16,29,292],"sass",{"title":294,"path":295,"description":296,"tags":297},"FREE PHOTOSHOP PLUGINS","\u002Fblog\u002Ffree-photoshop-plugins","There are so many amazing free Photoshop plugins you can download for Photoshop CS6 and CC. There are plugins for photo effects, noise reduction, painting, abstract art, layouts, and more! Let’s have a look at few of the best.",[9,112],{"title":299,"path":300,"description":301,"tags":302},"FRONT END PERFORMANCE","\u002Fblog\u002Ffront-end-performance","Front end performance can be a great experience or a horrifying nightmare that could highly impact the end user experience, and lead to users leaving your website.",[16,303],"performance",{"title":305,"path":306,"description":307,"tags":308},"FUNCTIONAL JAVASCRIPT","\u002Fblog\u002Ffunctional-javascript","To understand Functional JavaScript and the quirks of JavaScript, we will have to look into the history of JavaScript and how it was created.",[16,17],{"title":310,"path":311,"description":312,"tags":313},"FUNCTIONAL PROGRAMMING","\u002Fblog\u002Ffunctional-programming","Abstract control flow and operations on data with functions in order to avoid side effects & reduce mutation of state",[16,17],{"title":315,"path":316,"description":317,"tags":318},"GIT – CLONING & BRANCHING","\u002Fblog\u002Fgit-cloning-branching","Imagine you are working in a team and one of your colleagues wants a copy of the your work, how do we start collaborating?",[16,17],{"title":320,"path":321,"description":322,"tags":323},"GIT INTRODUCTION","\u002Fblog\u002Fgit-introduction","Git is a distributed source control system, that is lighting fast and different from client-server systems. In this tutorial, we will learn how to get started with Git. By the end of this tutorial, you should be able to create a Git repository, record snapshots of your project for safekeeping, and view your project's history.",[16,324],"git",{"title":326,"path":327,"description":328,"tags":329},"GIT STAGING & REMOTES","\u002Fblog\u002Fgit-staging-remotes","Let’s say you are working on your local branch, made some changes and now not sure which files you have changed, how are you going to find your changes? You can find your changes by running the git diff command as below:",[16,324],{"title":331,"path":332,"description":333,"tags":334},"GIT STASH","\u002Fblog\u002Fgit-stash","Say you are halfway done with work on a branch, but an issue with 'master' needs fixing NOW. You're not quite ready to commit what you're working on, but need to make a quick fix to master. Fear not, just stash your current changes so you can switch to master quickly.",[16,324],{"title":336,"path":337,"description":338,"tags":339},"GOOGLE DRIVE – AUTHENTICATION","\u002Fblog\u002Fgoogle-drive-authentication","When you are developing an application interfacing Google Driver API, it's mandatory to consider how you are going to handle the authentication for your user. In this article, we are discussing how to implement Google Drive Authentication for your app via its API.",[16,17],{"title":341,"path":342,"description":343,"tags":344},"GOOGLE PICKER WITH DRIVE","\u002Fblog\u002Fgoogle-picker-with-drive","\"Google Drive is a file storage service that enables users to organize, backup, and",[16,17],{"title":346,"path":347,"description":348,"tags":349},"GRUNT WATCH & LIVERELOAD WITH JAVASCRIPT & SASS","\u002Fblog\u002Fgrunt-watch-livereload-with-javascript-sass","Grunt is a task runner that has a ton of plugins for doing things like compiling LESS\u002FSASS into CSS, concatenating JavaScript, minifying, etc. It also has a package for watching files (the same way CodeKit and Prepros does) and firing off certain tasks when they’re modified.",[16,17,350],"grunt",{"title":352,"path":353,"description":354,"tags":355},"HOW TO USE GRUNT","\u002Fblog\u002Fhow-to-use-grunt","In this article, we’ll look at how to use Grunt in your project to automate some of your repetitive tasks. We’ll look at what Grunt is, how to setup Grunt and then create a simple project with Grunt doing the heavy lifting of the some of the tasks.",[16,17,350],{"title":357,"path":358,"description":359,"tags":360},"HOW TO ADD A COVER TO AN EPUB, PDF OR A KINDLE MOBI BOOK","\u002Fblog\u002Fhow-to-add-a-cover-to-an-epub-pdf-or-a-kindle-mobi-book","EPUB, PDF and Kindle MOBI books converted from other formats or downloaded from torrent sites are sometimes cover-missing, which inevitably makes the whole eBook-reading journey less satisfactory",[361,362],"technology","tips",{"title":364,"path":365,"description":366,"tags":367},"How to lint staged Git files","\u002Fblog\u002Fhow-to-lint-staged-git-files","We use linting to automate code formatting issues, to fix syntax errors and coding style. For example, you may have forgotten a semi-colon during aor bug fix you may have accidentally left a console.log statement.",[16,17],{"title":369,"path":370,"description":371,"tags":372},"HOW TO MAKE AJAX CALLS IN JQUERY","\u002Fblog\u002Fhow-to-make-ajax-calls-in-jquery","There are more than one way to make AJAX calls in jQuery. In this tutorial, let’s compare these methods as well as inspect the AJAX calls with Firebug.",[16,17],{"title":374,"path":375,"description":376,"tags":377},"HOW TO USE TELEPHOTO LENSES","\u002Fblog\u002Fhow-to-use-telephoto-lenses","Telephoto lenses are useful for wildlife and landscape photography, given their ability to enlarge distant subjects, but they’re also great for giving your photo an artistic look.",[89],{"title":379,"path":380,"description":381,"tags":382},"HTML INTRODUCTION","\u002Fblog\u002Fhtml-introduction","The language of a webpage is HTML. HTML allows you to take a plain text document created in any simple text editor and organize it into lists, link to other webpages, including images, and more.",[16,383],"html",{"title":385,"path":386,"description":387,"tags":388},"HTML5 API – LOCAL STORAGE, GEOLOCATION & OFFLINE CACHE MANIFEST","\u002Fblog\u002Fhtml5-api-local-storage-geolocation-offline-cache-manifest","Local storage is more secure, and large amounts of data can be stored locally, without affecting website performance. Unlike cookies, the storage limit is far larger (at least 5MB) and information is never transferred to the server.",[16,17],{"title":390,"path":391,"description":392,"tags":393},"HTML5 ELEMENTS","\u002Fblog\u002Fhtml5-elements","HTML5 offers new elements for improving semantics of code as well as better document structure. These elements could now be used to replace traditional HTML code like \u003Cdiv id=”nav”> \u003Cdiv class=”header”> \u003Cdiv id=”footer”>",[16,383],{"title":395,"path":396,"description":397,"tags":398},"HTML5 INTRODUCTION","\u002Fblog\u002Fhtml5-introduction","HTML5 is the latest HTML standard. It walks hand in hand with CSS3, the latest CSS standard.",[16,17],{"title":400,"path":401,"description":402,"tags":403},"HTTP2: NEW FEATURES","\u002Fblog\u002Fhttp2-new-features","HTTP\u002F2 (originally named HTTP\u002F2.0) is the second major version of the HTTP network protocol used by the World Wide Web.",[16,404],"http2",{"title":406,"path":407,"description":408,"tags":409},"IMMUTABLE.JS","\u002Fblog\u002Fimmutable-js","Immutable.js is a library from Facebook which provides immutable data structures and utilities that we can introduce to our applications",[16,17],{"title":411,"path":412,"description":413,"tags":414},"Improve JavaScript Performance with Tree Shaking","\u002Fblog\u002Fimprove-javascript-performance-with-treeshaking","Tree shaking is the process used by bundlers like Webpack for dead-code elimination in JavaScript.",[16,17],{"title":416,"path":417,"description":418,"tags":419},"Improving JavaScript Performance for Web","\u002Fblog\u002Fimproving-javascript-performance-for-web","JavaScript optimisation is becoming increasingly necessary for improving application performance. Let’s look at some of the challenges associated with JavaScript and how to optimise performance.",[16,17,303],{"title":421,"path":422,"description":423,"tags":424},"Improving Next.js Performance","\u002Fblog\u002Fimproving-next-js-performance","Next.js is a zero-config React framework for building server-side and static web applications bundled with enhanced developer experience with features for products such as smart bundling, TypeScript support, route pre-fetching, hybrid static & server rendering, and more.",[16,17,425,303],"nextjs",{"title":427,"path":428,"description":429,"tags":430},"INDEXEDDB","\u002Fblog\u002Findexeddb","IndexedDB stands for Indexed Database, is a web standard for storing large amounts of client-side data in a structured manner. This low-level API is able to index data which enables performance rich search on data.",[16,17,431],"indexeddb",{"title":433,"path":434,"description":435,"tags":436},"INSTALL D-LINK DWA-125 WIRELESS DRIVER ON LINUX","\u002Fblog\u002Finstall-d-link-dwa-125-wireless-driver-on-linux","'If you have recently bought a D-Link Wireless Adapter (DWA-125) for your Linux machine and wondering how to get it working, this article might help you get started.",[361,362],{"title":438,"path":439,"description":440,"tags":441},"INSTALLING NODE.JS","\u002Fblog\u002Finstalling-node-js","In this article we are discussing how to get Node.js working on OSX along with npm, the package manager for node.",[16,17,442],"node.js",{"title":444,"path":445,"description":446,"tags":447},"INTEROPERABLE CSS","\u002Fblog\u002Finteroperable-css","Interoperable CSS or ICSS is a low-level file format that enables CSS Modules, designed for loader implementers (not for end users).",[16,29],{"title":449,"path":450,"description":451,"tags":452},"INTRODUCTION TO D3","\u002Fblog\u002Fintroduction-to-d3","D3 is a data visualization library written in JavaScript. It stands for Data-Driven Documents where Document stand for the DOM or the Docucment Object Model of a wweb page.",[16,17,453],"d3",{"title":455,"path":456,"description":457,"tags":458},"INTRODUCTION TO EMBER.JS","\u002Fblog\u002Fintroduction-to-ember-js","Ember.js is a JavaScript web application framework based on the MVC architectural pattern. It allows developers to create scalable single-page applications by incorporating common idioms and best practices into a framework that provides a rich object model, declarative two-way data binding, computed properties, automatically-updating templates powered by Handlebars.js, and a router for managing application state.",[16,17,173],{"title":460,"path":461,"description":462,"tags":463},"INTRODUCTION TO GULP","\u002Fblog\u002Fintroduction-to-gulp","Gulp is a JavaScript task runner. It’s an alternative to Grunt, which allowed you to define your tasks using JavaScript inside of a file called Gruntfile.js. In this tutorial, I’ll show you how to install Gulp and create a simple configuration file to get your feet wet with this great new task runner.",[16,17,83],{"title":465,"path":466,"description":467,"tags":468},"INTRODUCTION TO HAPI","\u002Fblog\u002Fintroduction-to-hapi","Created by Eran Hammer, hapi.js is an open source framework built on top of Node.js for building web applications and services by Wallmart. In this tutorial, we will go through the advantages of hapi and build a simple application using hapi as the server.",[16,17,442],{"title":470,"path":471,"description":472,"tags":473},"INTRODUCTION TO WEBPACK","\u002Fblog\u002Fintroduction-to-webpack","Webpack is a module bundler. Webpack takes modules with dependencies and generates static assets representing those modules.",[16,17,140],{"title":475,"path":476,"description":477,"tags":478},"ios-7-design-guidelines","\u002Fblog\u002Fios-7-design-guidelines","With the release of iOS 7 design guidelines, app designers and developers will have to adjust the language to match the new \"flat\" design of iOS. In addition to the grid system, the dimensions of icons and commonly used elements, typography and iconography has been updated by Apple in many ways.",[16,9,479],"ios",{"title":481,"path":482,"description":483,"tags":484},"ISO NOISE REDUCTION","\u002Fblog\u002Fiso-noise-reduction","Using great noise reduction is like upgrading your lens. Why do we pay 16x more for one 50mm lens vs. another?",[89],{"title":486,"path":487,"description":488,"tags":489},"ISOMORPHIC JAVASCRIPT","\u002Fblog\u002Fisomorphic-javascript","Isomorphic JavaScript means that we get to share the same code on the client and on the server. So basically, you are rendering your application markup on the server and piping it down as complete HTML to the browser.",[16,17],{"title":491,"path":492,"description":493,"tags":494},"ITCSS","\u002Fblog\u002Fitcss","ITCSS or Inverted Triangle CSS is a meta framework designed to address some common issues around CSS we encounter today. Introduced by Harry Roberts, it is a sane, scalable, managed architecture for CSS.",[16,29],{"title":496,"path":497,"description":498,"tags":499},"JAVASCRIPT ARRAYS","\u002Fblog\u002Fjavascript-arrays","This beginner-level article will discuss further about JavaScript arrays in detail. JavaScript arrays are used to store multiple values in a single variable. JavaScript has an built-in object for manipulating arrays called Array.",[16,17],{"title":501,"path":502,"description":503,"tags":504},"JAVASCRIPT & CLOSURES","\u002Fblog\u002Fjavascript-closures","A closure is an inner function that has access to the outer (enclosing) function’s variables—scope chain.",[16,17],{"title":506,"path":507,"description":508,"tags":509},"JAVASCRIPT CONSOLE","\u002Fblog\u002Fjavascript-console","'The JavaScript Console or the Console Object provides access to the browser’s debugging console.",[16,17],{"title":511,"path":512,"description":513,"tags":514},"JAVASCRIPT & CONSTRUCTOR","\u002Fblog\u002Fjavascript-constructor","ECMAScript is a object based language. An object has a built-in property named constructor.",[16,17],{"title":516,"path":517,"description":518,"tags":519},"JavaScript Design Patterns","\u002Fblog\u002Fjavascript-design-patterns","Design patterns are advanced object-oriented solutions to commonly occurring software problems.  Patterns are about reusable designs and interactions of objects.  Each pattern has a name and becomes part of a vocabulary when discussing complex design solutions.",[16,17,520],"patterns",{"title":522,"path":523,"description":524,"tags":525},"JAVASCRIPT HOISTING AND SCOPE","\u002Fblog\u002Fjavascript-hoisting-and-scope","Hoisting is JavaScript's default behaviour of moving all declarations to the top of the current scope (to the top of the current script or the current function). In different words, a variable can be used before it has been declared.",[16,17],{"title":527,"path":528,"description":529,"tags":530},"JAVASCRIPT & PROTOTYPE","\u002Fblog\u002Fjavascript-prototype","Prototype objects are just simple JavaScript objects and may have their own prototypes. If a prototype has a non-null reference to its prototype, and so on, this is called the prototype chain.",[16,17],{"title":532,"path":533,"description":534,"tags":535},"JELLY BEAN (ANDROID 4.1 SDK) NEW FEATURES","\u002Fblog\u002Fjelly-bean-android-4-1-sdk-new-features","In this article I would like to discuss the new features of Jelly Bean, what has changed from the previous releases, and more.",[361,536],"android",{"title":538,"path":539,"description":540,"tags":541},"JQUERY INTRODUCTION","\u002Fblog\u002Fjquery-introduction","JQuery is a fast, small, and feature-rich JavaScript library. It makes things like HTML document traversal and manipulation, event handling, animation, and Ajax much simpler with an easy-to-use API that works across a multitude of browsers.",[16,17,106],{"title":543,"path":544,"description":545,"tags":546},"JQUERY – HOW TO USE","\u002Fblog\u002Fjquery-use","In this article we’ll look at how we can use jquery to manipulate, traverse and select DOM elements at ease. Before we start we have to download jquery and load it in your HTML document",[16,17,106],{"title":548,"path":549,"description":550,"tags":551},"LEXICAL SCOPE","\u002Fblog\u002Flexical-scope","Lexical scope means that scope is defined by author-time decisions of where functions are declared. The lexing phase of compilation is essentially able to know where and how all identifiers are declared, and predict how they will be looked up during execution.",[16,17],{"title":553,"path":554,"description":555,"tags":556},"MAINTAINABLE JAVASCRIPT","\u002Fblog\u002Fmaintainable-javascript","If you are working on a project by your own, you might not worry about the structure, convention and organisation of your code given you fully understand how it works. But working in a team environment it is necessary to make sure that your team members understand your code, easily adaptable and extensible so the importance of maintainable javascript is inevitable.",[16,17],{"title":558,"path":559,"description":560,"tags":561},"MOBILE WEB INTRODUCTION","\u002Fblog\u002Fmobile-web-introduction","What is the mobile web? The mobile web refers to access to the world wide web, i.e. the use of browser-based Internet services, from a handheld mobile device, such as a smartphone or a feature phone, connected to a mobile network or other wireless network.",[16,29,161],{"title":563,"path":564,"description":565,"tags":566},"MODELS & EMBER DATA","\u002Fblog\u002Fmodels-ember-data","If you are thinking of consuming data in your Ember application, you can store them in fixtures. But what if you want to fetch data from a server?",[16,17,173],{"title":568,"path":569,"description":570,"tags":571},".NET FRAMEWORK Q&A","\u002Fblog\u002Fnet-framework-qna","In this article, we are discussing few common .NET frequently asked questions and answers.",[16,572],".net-framework",{"title":574,"path":575,"description":576,"tags":577},"NextJS Client-side, Server-side & Static Rendering","\u002Fblog\u002Fnextjs-client-side-server-side-and-static-rendering","The future of SEO and search ranking algorithms are now in heavy favour of static or server-side rendering. This means building static or server-side rendered apps instantly gain advantages in rankings.",[16,17,425,578],"ssr",{"title":580,"path":581,"description":582,"tags":583},"NODE JS SECURITY","\u002Fblog\u002Fnode-js-security","Node.js has gained momentum in the recent years but there are not many security guidelines available out there.",[16,17],{"title":585,"path":586,"description":587,"tags":588},"NODE.JS – EVENTS","\u002Fblog\u002Fnodejs-events","Many objects in Node emit events: a net.Server emits an event each time a peer connects to it, and fs.readStream emits an event when the file is opened. All objects which emit events are instances of events.EventEmitter.",[16,17,442],{"title":590,"path":591,"description":592,"tags":593},"NODEJS INSTALL WITH NVM","\u002Fblog\u002Fnodejs-install-with-nvm","Node Version Manager is a simple bash script to manage multiple active node.js versions. In this article, we are going to discuss about managing NodeJS install with NVM.",[16,17,442],{"title":595,"path":596,"description":597,"tags":598},"NODE.JS INTRODUCTION","\u002Fblog\u002Fnodejs-introduction","\"Node.js allows you to build scalable network",[16,17,442],{"title":600,"path":601,"description":602,"tags":603},"Node.js Memory Management","\u002Fblog\u002Fnodejs-memory-management","Node.js memory management provides means to dynamically allocate memory chunks for programs when they request them and free it when they are no longer needed, so they can be reused. Application-level memory management can be manual or automatic.",[16,17,442],{"title":605,"path":606,"description":607,"tags":608},"NODEJS PATTERNS","\u002Fblog\u002Fnodejs-patterns","A design pattern is a general, reusable solution to a commonly occurring problem. In this article we are going to look at some common design patterns we can use for Node.js.",[16,442],{"title":610,"path":611,"description":612,"tags":613},"NPM SCRIPTS","\u002Fblog\u002Fnpm-scripts","Task runners like Gulp or Grunt have been go to choice for the front end projects for last few years. Gulp being the latest between the two, and being the popular choice for last couple of years, one might wonder what’s wrong with it.",[16,17,442],{"title":615,"path":616,"description":617,"tags":618},"OPTIMIZING ASP.NET MVC SITES","\u002Fblog\u002Foptimizing-asp-net-mvc-sites","In this article we discuss about four ways of optimizing ASP.NET MVC sites",[16,184,619],"asp.net",{"title":621,"path":622,"description":623,"tags":624},"PHOTOSHOP CC NEW FEATURES","\u002Fblog\u002Fphotoshop-cc-new-features","Adobe Creative Cloud’s Photoshop CC  is packed with new tools and features, as well as some key workflow enhancements.",[9,112],{"title":626,"path":627,"description":628,"tags":629},"POSTCSS","\u002Fblog\u002Fpostcss","PostCSS is a tool for transforming CSS with JavaScript plugins. These plugins can support variables and mixins, transpile future CSS syntax, inline images, and more",[16,29],{"title":631,"path":632,"description":633,"tags":634},"PROPER TAIL CALLS","\u002Fblog\u002Fproper-tail-calls","A tail call happens when a function Foo calls a function Bar as its final action. At that point Foo stops and passes the execution to function Bar and disappears not having to do anything from there onwards.",[16,17],{"title":636,"path":637,"description":638,"tags":639},"PROXIES","\u002Fblog\u002Fproxies","Proxies enable you to intercept and customize actions performed on JavaScript objects such as `getter` and `setter` for getting and setting properties. This is really helpful in scenarios like JSON based API interaction where you have to customize data coming back from the API.",[16,17],{"title":641,"path":642,"description":643,"tags":644},"REACT BEST PRACTICES & PATTERNS","\u002Fblog\u002Freact-best-practices-patterns","In this article we discuss about React best practices & patterns for writing React components, and the recommendations here aim at coding convensions and patterns.",[16,17,140],{"title":646,"path":647,"description":648,"tags":649},"React Component Library with Material UI","\u002Fblog\u002Freact-component-library-with-material-ui","Using Material UI which supports Styled Components is an excellent combination of libraries to start building a design system of your own",[16,17,40,650],"material-ui",{"title":652,"path":653,"description":654,"tags":655},"REACT CONCURRENT MODE","\u002Fblog\u002Freact-concurrent-mode","'Regardless of all the optimizations we do in in React apps, rendering process so far has been a blocking and cannot be interrupted.",[16,40],{"title":657,"path":658,"description":659,"tags":660},"REACT CONTEXT API","\u002Fblog\u002Freact-context-api","The context API will finally become a first-class citizen with the release of React 16.3. Facebook has announced that they are going to release a stable yet revamped version of the context API.",[16,17,40],{"title":662,"path":663,"description":664,"tags":665},"REACT & CSS","\u002Fblog\u002Freact-css","In a scaling project, the way CSS spans out can bring us various problems. Let’s look at these issues, and discuss them in detail.",[16,17],{"title":667,"path":668,"description":669,"tags":670},"REACT DEPLOYMENT","\u002Fblog\u002Freact-deployment","In this article, we are discussing about how to perform a production deployment for React",[16,17,140],{"title":672,"path":673,"description":674,"tags":675},"REACT & ES6","\u002Fblog\u002Freact-es6","ES6 is here and now. So writing React JS components in ES6 will be beneficial considering the new features ES6 brings to us.",[16,17],{"title":677,"path":678,"description":679,"tags":680},"REACT & FLUX","\u002Fblog\u002Freact-flux","Flux is the application architecture that Facebook uses for building client-side web applications. It complements React’s composable view components by utilizing a unidirectional data flow. It’s more of a pattern rather than a formal framework.",[16,17,681],"raect.js",{"title":683,"path":684,"description":685,"tags":686},"REACT & NIGHTWATCH","\u002Fblog\u002Freact-nightwatch","Nightwatch is an end-to-end test framework. The reasons nightwatch is your best choice can be decided upon the reasons described in this article.",[16,17],{"title":688,"path":689,"description":690,"tags":691},"React Re-rendering Components","\u002Fblog\u002Freact-re-rendering-components","React is known for providing a fast user experience by only updating the parts of the UI that have changed. In this article, we discuss how we can optimise the render performance by understanding how React decides to re-render",[16,17,40],{"title":693,"path":694,"description":695,"tags":696},"REACT & REDUX","\u002Fblog\u002Freact-redux","'Redux allows you to manage the state with a minimal API but completely predictable behaviour – a predictable state container for JavaScript apps.",[16,17,140],{"title":698,"path":699,"description":700,"tags":701},"REACT ROUTER","\u002Fblog\u002Freact-router","React Router is the most popular routing library for React, which synchronizes your UI with the URL. It is built on top of React and helps you to build new screens quickly.",[16,17,140],{"title":703,"path":704,"description":705,"tags":706},"REACT STATELESS FUNCTIONAL COMPONENTS","\u002Fblog\u002Freact-stateless-functional-components","React stateless functional components are pure JavaScript functions that only have a render() function and no lifecycle methods like componentDidMount.",[16,17,140],{"title":708,"path":709,"description":710,"tags":711},"REACT V15","\u002Fblog\u002Freact-v15","Facebook released React v15.0.0 on 07\u002F04\u002F2016. The most noticeable change was the version number jump from 0.14 to 15.0.",[16,17,140],{"title":713,"path":714,"description":715,"tags":716},"REDUX & SAGAS","\u002Fblog\u002Fredux-sagas","In reality, for a real world application, just consuming an API end point and displaying the data is not going to cut it.",[16,17,140,717,718],"redux","redux-saga",{"title":720,"path":721,"description":722,"tags":723},"REQUIREJS & HANDLEBARS","\u002Fblog\u002Frequirejs-handlebars","If we are building a web application, code complexity could grow and the app can get bigger. Number of plug-ins can grow bigger, and you will feel the need of adding more modular components. RequireJS can address these issues to increase the speed of your application in an efficient way.",[16,17],{"title":725,"path":726,"description":727,"tags":728},"RESCUING THE DETAILS WITH TOPAZ LABS","\u002Fblog\u002Frescuing-details-topaz-labs","Here are the steps on how to recover shadows and make an image more vibrant with the Topaz Lab’s plug-ins.",[89],{"title":730,"path":731,"description":732,"tags":733},"RUBY API – REST ROUTES, CONSTRAINTS & NAMESPACES","\u002Fblog\u002Fruby-api-rest-routes-constraints-namespaces","In this article, we are going to study REST, routes, constraints, and namespaces. Before we dive into these concepts let’s take a look at how web-based services in the perspective of web users.",[16,124],{"title":735,"path":736,"description":737,"tags":738},"RUBY – INTRODUCTION","\u002Fblog\u002Fruby-introduction","Ruby is a dynamic, reflective, object-oriented, general-purpose programming language. It was designed and developed in the mid-1990s by Yukihiro “Matz” Matsumoto in Japan.",[16,124],{"title":740,"path":741,"description":742,"tags":743},"RUN COMMANDS FOR WINDOWS 7","\u002Fblog\u002Frun-commands-for-windows-7","A run command is the name of the file that starts an application, which is an executable for a program.",[361,744],"windows",{"title":746,"path":747,"description":748,"tags":749},"SAFARI CSS HACKS","\u002Fblog\u002Fsafari-css-hacks","Applying changes only for Safari has been always a challenging task. Also adding the fact that Safari has changed since version 6.1 makes it even harder. In this article we are going to discuss Safari CSS hacks.",[16,29,383],{"title":751,"path":752,"description":753,"tags":754},"SASS CONTROL DIRECTIVES","\u002Fblog\u002Fsass-control-directives","Sass control directives helps creating libraries for reuse and distribution, there by contribute to writing leaner Sass. Advanced frameworks use mixins. These mixins use directives such as @if, @for, each and @while.",[16,17],{"title":756,"path":757,"description":758,"tags":759},"SASS FOR CSS","\u002Fblog\u002Fsass-for-css","Sass is a scripting langauage that is interpreted into CSS. Sass stands for Syntatically Awesome Stylesheets.  Sass consists of two syntaxes. The original syntax, called “the indented syntax”, uses a syntax similar to Haml. It uses indentation to separate code blocks and newline characters to separate rules.",[16,29,292],{"title":761,"path":762,"description":763,"tags":764},"SASS INTRODUCTION","\u002Fblog\u002Fsass-introduction","CSS is crafted to be simple, but over time your styles become large and your files become bloated with selectors growing out of control. Scaling simplicity is difficult.",[16,17],{"title":766,"path":767,"description":768,"tags":769},"SASS – VARIABLES","\u002Fblog\u002Fsass-variables","Native CSS variable support is still in its infancy, but Sass affords us a way to set reusable values.",[16,29,292],{"title":771,"path":772,"description":773,"tags":774},"SECURING YOUR ASP.NET MVC 4 APPLICATION","\u002Fblog\u002Fsecuring-your-asp-net-mvc-4-application","Out of the Box when you create an MVC web site, anyone can post anything to your web site. So we need to control the user access.",[16,184,619],{"title":776,"path":777,"description":778,"tags":779},"SEMANTIC HTML","\u002Fblog\u002Fsemantic-hmtl","Semantic HTML is a way of describing the content of an HTML document, it is not a way of making your page look pretty or visually appealing.",[16,383],{"title":781,"path":782,"description":783,"tags":784},"SEND EMAIL IN UMBRACO","\u002Fblog\u002Fsend-email-in-umbraco","Sending email is a common functionality of any client-facing website. Is it possible to be implemented in Umbraco without a plugin? Yes, and I’m going to demonstrate how to implement such functionality.",[16,785,619],"umbraco",{"title":787,"path":788,"description":789,"tags":790},"Server Side Rendering with Suspense in React 18","\u002Fblog\u002Fserver-side-rendering-with-suspense-in-react-18","React 18 will include architectural improvements to React server-side rendering (SSR) performance.",[16,17,40,578],{"title":792,"path":793,"description":794,"tags":795},"SERVICE WORKERS","\u002Fblog\u002Fservice-workers","Service Worker is a new browser feature which provides event-driven scripts that run independently of web pages. Unlike other workers, Service Workers can be shut down at the end of events, note the lack of retained references from documents, and they have access to domain-wide events such as network fetches.",[16,17,796],"service-worker",{"title":798,"path":799,"description":800,"tags":801},"SETTING UP UMBRACO IN VISUAL STUDIO","\u002Fblog\u002Fsetting-up-umbraco-in-visual-studio","In this article we discuss about setting an Umbraco project with ASP.NET with step by step instructions",[16,619,785],{"title":803,"path":804,"description":805,"tags":806},"Should we declare React functional components with a const or a function?","\u002Fblog\u002Fshould-we-declare-react-functional-components-with-a-const-or-a-function","If you have been writing React functional components for a while now, you may have encountered two ways of declaring a component - an arrow function or a function declaration.",[16,17,807,40],"typesript",{"title":809,"path":810,"description":811,"tags":812},"SMACSS","\u002Fblog\u002Fsmacss","SMACSS stands for Scalable and Modular Architecture for CSS. It is pronounced “smacks” and introduced by Jonathan Snook.",[16,29,292],{"title":814,"path":815,"description":816,"tags":817},"STRUCTURE YOUR SASS","\u002Fblog\u002Fstructure-your-sass","Sass enables your you to separate your stylesheets into individual files, and then you can use the @import directive to include your individual files into one master stylesheet.",[16,29,292],{"title":819,"path":820,"description":821,"tags":822},"STYLUS FOR CSS","\u002Fblog\u002Fstylus-for-css","When your site grows, the CSS can grow along with it, and the maintenance is no longer  trivial. You could break your CSS in to different files and use @import to structure it into one file. But this doesn’t resolve all your architecting and maintenance problems. ",[16,29],{"title":824,"path":825,"description":826,"tags":827},"TAPE & TAP","\u002Fblog\u002Ftape-tap","Tape & Tap are testing tools you can use instead of Mocha or Jasmine. The Test Anything Protocol (TAP) is a definition that has been around since 1987 and Tape is a test harness written in JavaScript for Node and the browser.",[16,17,828],"testing",{"title":830,"path":831,"description":832,"tags":833},"TESTING REACT COMPONENTS WITH ENZYME","\u002Fblog\u002Ftesting-react-components-enzyme","React has become the framework of choice recently within the JavaScript community. And the tools for testing React components has also gained lot of attention.",[16,17,220],{"title":835,"path":836,"description":837,"tags":838},"THE MOST EXPENSIVE CAMERAS IN THE WORLD","\u002Fblog\u002Fthe-most-expensive-cameras-in-the-world","Digital photography has become a hobby that is more and more affordable in recent years, with the increase of hobbyist photographers to serious enthusiasts the camera and lens manufacturers have become competitive and innovative in releasing high specification products.",[89],{"title":840,"path":841,"description":842,"tags":843},"Things to avoid when using React Hooks","\u002Fblog\u002Fthings-to-avoid-when-using-react-hooks","In this article we discuss about a few things to avoid when writing React Hooks and forming good habits through understanding",[16,17,40],{"title":845,"path":846,"description":847,"tags":848},"THINK REACT","\u002Fblog\u002Fthink-react","As we know, React is a library for creating user interfaces. It renders your UI and responds to events aka: the V in MVC. Because it is not as opinionated as many of other front-end JavaScript libraries, it plays nicely with your stack, whatever it maybe, Ruby, Java, Node.js or .NET.",[16,17,140],{"title":850,"path":851,"description":852,"tags":853},"THROTTLE FUNCTION CALLS IN JAVASCRIPT","\u002Fblog\u002Fthrottle-function-calls-in-javascript","If you have written a search component that returns matching result as you type – you would realise that sending a request to the server on every key press is not required as that can result in burdening the server with too many requests.",[16,17],{"title":855,"path":856,"description":857,"tags":858},"Turborepo: The Next Big Thing in Build Systems","\u002Fblog\u002Fturborepo-the-next-big-thing-in-build-systems","Turborepo is a high-performance build system for JavaScript and TypeScript codebases. Vercel who acquired Turborepo claims, through incremental builds, intelligent remote caching, and optimized task scheduling, Turborepo can boost build speeds by 85% or more, enabling teams of all sizes to maintain a fast and efficient build system that scales as codebases and teams grow.",[16,17,859],"nodejs",{"title":861,"path":862,"description":863,"tags":864},"TypeScript Enums vs String Literals","\u002Fblog\u002Ftypescript-enums-vs-string-literals","Enums help to define a set of named constants. Using enums can make it easier to document intent, or create a set of distinct cases.",[16,17,807],{"title":866,"path":867,"description":868,"tags":869},"TypeScript Features You Should No Longer Use","\u002Fblog\u002Ftypescript-features-you-should-no-longer-use","When TypeScript was originally invented by Microsoft in 2010, they implemented features missing from JavaScript at the time including module systems, classes, enums and decorators.",[16,17,870],"typescript",{"title":872,"path":873,"description":874,"tags":875},"Understanding cloneElement, isValidElement and Render Props","\u002Fblog\u002Funderstanding-cloneelement-isvalidelement-and-render-props","React provides several APIs for transforming elements: cloneElement, isValidElement.",[16,17,40],{"title":877,"path":878,"description":879,"tags":880},"UNITS FOR CSS FONT-SIZE","\u002Fblog\u002Funits-for-css-font-size","Fonts sizes in CSS can be measured in four different units adding confusion to the web developer on top of having to deal with different browsers. Which of these four units is the best? Finding a definitive answer is difficult.",[16,29],{"title":882,"path":883,"description":884,"tags":885},"USING ES6 WITH BABEL","\u002Fblog\u002Fusing-es6-babel","Some of the modern browsers are yet to catch up with the new language additions to ES6. This means we have to use Babel to transpile our code into ES5.",[16,17,220],{"title":887,"path":888,"description":889,"tags":890},"VIRTUAL DOM","\u002Fblog\u002Fvirtual-dom","If you are using React, there is a better chance you have heard about virtual DOM. In a nutshell, virtual DOM is an abstract version of the DOM, a lightweight copy of the actual DOM which we can manipulate the way we want and then apply to the DOM tree.",[16,17],{"title":242,"path":892,"description":893,"tags":894},"\u002Fblog\u002Fweb-application-security","'Cyber security has become a necessity for any web developer building client-facing web applications.",[16,895],"security",{"title":897,"path":898,"description":899,"tags":900},"WEB PAGE RENDERING","\u002Fblog\u002Fweb-page-rendering","'Web page rendering is an important subject to study in order to optimize page load times, and to understand how to design solutions to cater for that.",[16,17,29,383],{"title":902,"path":903,"description":904,"tags":905},"WEBPACK EXPORT MODULES","\u002Fblog\u002Fwebpack-export-modules","You may be working in a complex project, where multiple isolated modules need to be imported into a single parent module, you might want to configure Webpack.config to enable exporting modules.",[16,17],{"title":907,"path":908,"description":909,"tags":910},"WHAT IS AGILE PROJECT MANAGEMENT?","\u002Fblog\u002Fwhat-is-agile-project-management","Agile project management allows you to produce a smaller amount of deliverables more frequently and efficiently , making it an excellent choice for the teams that are working in the field of  business analysis, product development, programming , and other areas of collaboration.",[16,911],"agile",{"title":913,"path":914,"description":915,"tags":916},"WRITING FORMS IN REACT AND REDUX","\u002Fblog\u002Fwriting-forms-react","rWiting forms in React and Redux can be challenging, having to deal with forms and fields. In this article we are going to build couple of form using an exisiting library sepcifically for Redux called react-redux-form.",[16,29,383],{"id":918,"title":341,"author":919,"body":920,"date":3481,"description":343,"extension":3482,"image":3483,"meta":3484,"navigation":2836,"path":342,"seo":3485,"stem":3486,"tags":3487,"__hash__":3488},"blog\u002Fblog\u002Fgoogle-picker-with-drive.md","Sean Amarasinghe",{"type":921,"value":922,"toc":3459},"minimark",[923,928,937,940,956,960,963,977,980,991,995,998,1002,1005,1009,1012,1016,1019,1022,1026,1029,1111,1114,1118,1121,1204,1208,1211,1258,1261,1334,1338,1341,1413,1416,1420,1423,1510,1514,1528,1654,1658,1665,1825,1829,1832,2079,2083,2086,2093,2330,2333,2336,2585,2589,2592,2595,2871,2874,2876,2878,2882,2886,2889,2892,2899,2907,2911,2914,2917,3009,3013,3016,3019,3132,3135,3455],[924,925,927],"h2",{"id":926},"google-picker-with-drive","Google Picker with Drive",[929,930,931,932,936],"p",{},"Replaces your traditional upload form. Google Picker is a modal window we can put in our application\nthat integrates with many of Google’s services, including Drive. It’s Easier Than ",[933,934,935],"strong",{},"input type=”file”","\"",[929,938,939],{},"Google Picker uploads files directly to\nthe user’s Drive, which means...",[941,942,943,947,950,953],"ul",{},[944,945,946],"li",{},"It’s not taking up space on our server",[944,948,949],{},"It’s not using our bandwidth",[944,951,952],{},"We don’t have to write any upload code",[944,954,955],{},"It also looks a lot nicer than the standard file input",[924,957,959],{"id":958},"google-developers-console","Google Developers Console",[929,961,962],{},"To get started ..",[941,964,965,968,971,974],{},[944,966,967],{},"Create a New API Project",[944,969,970],{},"Enable the Google Picker API",[944,972,973],{},"Create a New OAuth Client ID",[944,975,976],{},"Create a Developer API Key",[929,978,979],{},"In our application..",[941,981,982,985,988],{},[944,983,984],{},"Include the Google API Loader script",[944,986,987],{},"Authorize the User",[944,989,990],{},"Render the Picker",[924,992,994],{"id":993},"creating-a-new-api-project","Creating a New API Project",[929,996,997],{},"In the Google Developers Console, create a new API Project.",[924,999,1001],{"id":1000},"enabling-the-google-picker-api","Enabling the Google Picker API",[929,1003,1004],{},"In the sidebar, goto APIs & auth > APIs then enable the Google Picker API.",[924,1006,1008],{"id":1007},"creating-a-new-oauth-client-id","Creating a New OAuth Client ID",[929,1010,1011],{},"Goto APIs & auth > Credentials then click CREATE NEW CLIENT ID.",[924,1013,1015],{"id":1014},"creating-a-api-key","Creating a API Key",[929,1017,1018],{},"Goto APIs & auth > Credentials then click CREATE NEW KEY and choose\nBrowser key.",[929,1020,1021],{},"Enter your site’s URL. The page will now show our newly created API key!",[924,1023,1025],{"id":1024},"the-google-api-loader-script","The Google API Loader script",[929,1027,1028],{},"This script will be used to load Google’s Authentication and Picker APIs.",[1030,1031,1036],"pre",{"className":1032,"code":1033,"language":1034,"meta":1035,"style":1035},"language-js shiki shiki-themes github-light github-dark","\u003Cbody>\n  \u003Cscript\n    type=\"text\u002Fjavascript\"\n    src=\"https:\u002F\u002Fapis.google.com\u002Fjs\u002Fapi.js?onload=onApiLoad\"\n  >\u003C\u002Fscript>\n\u003C\u002Fbody>\n","js","",[1037,1038,1039,1055,1064,1079,1090,1101],"code",{"__ignoreMap":1035},[1040,1041,1044,1048,1052],"span",{"class":1042,"line":1043},"line",1,[1040,1045,1047],{"class":1046},"sVt8B","\u003C",[1040,1049,1051],{"class":1050},"s9eBZ","body",[1040,1053,1054],{"class":1046},">\n",[1040,1056,1058,1061],{"class":1042,"line":1057},2,[1040,1059,1060],{"class":1046},"  \u003C",[1040,1062,1063],{"class":1050},"script\n",[1040,1065,1067,1071,1075],{"class":1042,"line":1066},3,[1040,1068,1070],{"class":1069},"sScJk","    type",[1040,1072,1074],{"class":1073},"szBVR","=",[1040,1076,1078],{"class":1077},"sZZnC","\"text\u002Fjavascript\"\n",[1040,1080,1082,1085,1087],{"class":1042,"line":1081},4,[1040,1083,1084],{"class":1069},"    src",[1040,1086,1074],{"class":1073},[1040,1088,1089],{"class":1077},"\"https:\u002F\u002Fapis.google.com\u002Fjs\u002Fapi.js?onload=onApiLoad\"\n",[1040,1091,1093,1096,1099],{"class":1042,"line":1092},5,[1040,1094,1095],{"class":1046},"  >\u003C\u002F",[1040,1097,1098],{"class":1050},"script",[1040,1100,1054],{"class":1046},[1040,1102,1104,1107,1109],{"class":1042,"line":1103},6,[1040,1105,1106],{"class":1046},"\u003C\u002F",[1040,1108,1051],{"class":1050},[1040,1110,1054],{"class":1046},[929,1112,1113],{},"this method gets called when the API\nLoader script is ready to use (we’ll define that method in a bit)",[924,1115,1117],{"id":1116},"loading-the-picker-api","Loading The Picker API",[929,1119,1120],{},"Before we can create a Google Picker modal window, we need to first load the necessary API.\nWe've setup a script tag which will call our local onApiLoad function when complete.\nImplement this function and have it load the auth and picker libraries.",[1030,1122,1124],{"className":1032,"code":1123,"language":1034,"meta":1035,"style":1035},"\u003Cscript>\n  function onApiLoad() {\n    gapi.load('auth');\n    gapi.load('picker');\n  }\n\u003C\u002Fscript>\n\u003Cscript src=\"https:\u002F\u002Fapis.google.com\u002Fjs\u002Fapi.js?onload=onApiLoad\">\u003C\u002Fscript>\n",[1037,1125,1126,1134,1139,1156,1169,1174,1182],{"__ignoreMap":1035},[1040,1127,1128,1130,1132],{"class":1042,"line":1043},[1040,1129,1047],{"class":1046},[1040,1131,1098],{"class":1050},[1040,1133,1054],{"class":1046},[1040,1135,1136],{"class":1042,"line":1057},[1040,1137,1138],{"class":1046},"  function onApiLoad() {\n",[1040,1140,1141,1144,1147,1150,1153],{"class":1042,"line":1066},[1040,1142,1143],{"class":1046},"    gapi.",[1040,1145,1146],{"class":1069},"load",[1040,1148,1149],{"class":1046},"(",[1040,1151,1152],{"class":1077},"'auth'",[1040,1154,1155],{"class":1046},");\n",[1040,1157,1158,1160,1162,1164,1167],{"class":1042,"line":1081},[1040,1159,1143],{"class":1046},[1040,1161,1146],{"class":1069},[1040,1163,1149],{"class":1046},[1040,1165,1166],{"class":1077},"'picker'",[1040,1168,1155],{"class":1046},[1040,1170,1171],{"class":1042,"line":1092},[1040,1172,1173],{"class":1046},"  }\n",[1040,1175,1176,1178,1180],{"class":1042,"line":1103},[1040,1177,1106],{"class":1046},[1040,1179,1098],{"class":1050},[1040,1181,1054],{"class":1046},[1040,1183,1185,1187,1189,1192,1194,1197,1200,1202],{"class":1042,"line":1184},7,[1040,1186,1047],{"class":1046},[1040,1188,1098],{"class":1050},[1040,1190,1191],{"class":1069}," src",[1040,1193,1074],{"class":1073},[1040,1195,1196],{"class":1077},"\"https:\u002F\u002Fapis.google.com\u002Fjs\u002Fapi.js?onload=onApiLoad\"",[1040,1198,1199],{"class":1046},">\u003C\u002F",[1040,1201,1098],{"class":1050},[1040,1203,1054],{"class":1046},[924,1205,1207],{"id":1206},"loading-the-auth-and-picker-apis","Loading the Auth and Picker APIs",[929,1209,1210],{},"The method below gets called when the Auth\nAPI is done loading (we’ll define that method in a bit too)",[1030,1212,1214],{"className":1032,"code":1213,"language":1034,"meta":1035,"style":1035},"function onApiLoad() {\n  gapi.load('auth', { callback: onAuthApiLoad });\n  gapi.load('picker');\n}\n",[1037,1215,1216,1227,1241,1253],{"__ignoreMap":1035},[1040,1217,1218,1221,1224],{"class":1042,"line":1043},[1040,1219,1220],{"class":1073},"function",[1040,1222,1223],{"class":1069}," onApiLoad",[1040,1225,1226],{"class":1046},"() {\n",[1040,1228,1229,1232,1234,1236,1238],{"class":1042,"line":1057},[1040,1230,1231],{"class":1046},"  gapi.",[1040,1233,1146],{"class":1069},[1040,1235,1149],{"class":1046},[1040,1237,1152],{"class":1077},[1040,1239,1240],{"class":1046},", { callback: onAuthApiLoad });\n",[1040,1242,1243,1245,1247,1249,1251],{"class":1042,"line":1066},[1040,1244,1231],{"class":1046},[1040,1246,1146],{"class":1069},[1040,1248,1149],{"class":1046},[1040,1250,1166],{"class":1077},[1040,1252,1155],{"class":1046},[1040,1254,1255],{"class":1042,"line":1081},[1040,1256,1257],{"class":1046},"}\n",[929,1259,1260],{},"this tells Google we want access to the user’s Drive, called after the user authenticates (we’ll implement that method next)",[1030,1262,1264],{"className":1032,"code":1263,"language":1034,"meta":1035,"style":1035},"function onAuthApiLoad() {\n  window.gapi.auth.authorize(\n    {\n      client_id: 'XXXXXXXXXXXX',\n      scope: ['https:\u002F\u002Fwww.googleapis.com\u002Fauth\u002Fdrive'],\n    },\n    handleAuthResult,\n  );\n}\n",[1037,1265,1266,1275,1286,1291,1302,1313,1318,1323,1329],{"__ignoreMap":1035},[1040,1267,1268,1270,1273],{"class":1042,"line":1043},[1040,1269,1220],{"class":1073},[1040,1271,1272],{"class":1069}," onAuthApiLoad",[1040,1274,1226],{"class":1046},[1040,1276,1277,1280,1283],{"class":1042,"line":1057},[1040,1278,1279],{"class":1046},"  window.gapi.auth.",[1040,1281,1282],{"class":1069},"authorize",[1040,1284,1285],{"class":1046},"(\n",[1040,1287,1288],{"class":1042,"line":1066},[1040,1289,1290],{"class":1046},"    {\n",[1040,1292,1293,1296,1299],{"class":1042,"line":1081},[1040,1294,1295],{"class":1046},"      client_id: ",[1040,1297,1298],{"class":1077},"'XXXXXXXXXXXX'",[1040,1300,1301],{"class":1046},",\n",[1040,1303,1304,1307,1310],{"class":1042,"line":1092},[1040,1305,1306],{"class":1046},"      scope: [",[1040,1308,1309],{"class":1077},"'https:\u002F\u002Fwww.googleapis.com\u002Fauth\u002Fdrive'",[1040,1311,1312],{"class":1046},"],\n",[1040,1314,1315],{"class":1042,"line":1103},[1040,1316,1317],{"class":1046},"    },\n",[1040,1319,1320],{"class":1042,"line":1184},[1040,1321,1322],{"class":1046},"    handleAuthResult,\n",[1040,1324,1326],{"class":1042,"line":1325},8,[1040,1327,1328],{"class":1046},"  );\n",[1040,1330,1332],{"class":1042,"line":1331},9,[1040,1333,1257],{"class":1046},[924,1335,1337],{"id":1336},"authenticating-the-user","Authenticating the User",[929,1339,1340],{},"Save the oauthToken and create the Picker.",[1030,1342,1344],{"className":1032,"code":1343,"language":1034,"meta":1035,"style":1035},"var oauthToken;\nfunction handleAuthResult(authResult) {\n  if (authResult && !authResult.error) {\n    oauthToken = authResult.access_token;\n    createPicker();\n  }\n}\n",[1037,1345,1346,1354,1370,1387,1397,1405,1409],{"__ignoreMap":1035},[1040,1347,1348,1351],{"class":1042,"line":1043},[1040,1349,1350],{"class":1073},"var",[1040,1352,1353],{"class":1046}," oauthToken;\n",[1040,1355,1356,1358,1361,1363,1367],{"class":1042,"line":1057},[1040,1357,1220],{"class":1073},[1040,1359,1360],{"class":1069}," handleAuthResult",[1040,1362,1149],{"class":1046},[1040,1364,1366],{"class":1365},"s4XuR","authResult",[1040,1368,1369],{"class":1046},") {\n",[1040,1371,1372,1375,1378,1381,1384],{"class":1042,"line":1066},[1040,1373,1374],{"class":1073},"  if",[1040,1376,1377],{"class":1046}," (authResult ",[1040,1379,1380],{"class":1073},"&&",[1040,1382,1383],{"class":1073}," !",[1040,1385,1386],{"class":1046},"authResult.error) {\n",[1040,1388,1389,1392,1394],{"class":1042,"line":1081},[1040,1390,1391],{"class":1046},"    oauthToken ",[1040,1393,1074],{"class":1073},[1040,1395,1396],{"class":1046}," authResult.access_token;\n",[1040,1398,1399,1402],{"class":1042,"line":1092},[1040,1400,1401],{"class":1069},"    createPicker",[1040,1403,1404],{"class":1046},"();\n",[1040,1406,1407],{"class":1042,"line":1103},[1040,1408,1173],{"class":1046},[1040,1410,1411],{"class":1042,"line":1184},[1040,1412,1257],{"class":1046},[929,1414,1415],{},"this is a method we’ll define next that will create our Picker",[924,1417,1419],{"id":1418},"after-authentication","After Authentication",[929,1421,1422],{},"We're successfully loading the Google Auth and Google Picker libraries! After the auth library has loaded, we'll need to authorize with the Google API. To do this, create a new function named authenticateWithGoogle which will be run after the auth library has loaded.",[1030,1424,1426],{"className":1032,"code":1425,"language":1034,"meta":1035,"style":1035},"\u003Cscript>\n  function onApiLoad() {\n    gapi.load('auth', {'callback': authenticateWithGoogle});\n    gapi.load('picker');\n  }\n  function authenticateWithGoogle() {\n  }\n\u003C\u002Fscript>\n\u003Cscript src=\"https:\u002F\u002Fapis.google.com\u002Fjs\u002Fapi.js?onload=onApiLoad\">\u003C\u002Fscript>\n",[1037,1427,1428,1436,1440,1459,1471,1475,1480,1484,1492],{"__ignoreMap":1035},[1040,1429,1430,1432,1434],{"class":1042,"line":1043},[1040,1431,1047],{"class":1046},[1040,1433,1098],{"class":1050},[1040,1435,1054],{"class":1046},[1040,1437,1438],{"class":1042,"line":1057},[1040,1439,1138],{"class":1046},[1040,1441,1442,1444,1446,1448,1450,1453,1456],{"class":1042,"line":1066},[1040,1443,1143],{"class":1046},[1040,1445,1146],{"class":1069},[1040,1447,1149],{"class":1046},[1040,1449,1152],{"class":1077},[1040,1451,1452],{"class":1046},", {",[1040,1454,1455],{"class":1077},"'callback'",[1040,1457,1458],{"class":1046},": authenticateWithGoogle});\n",[1040,1460,1461,1463,1465,1467,1469],{"class":1042,"line":1081},[1040,1462,1143],{"class":1046},[1040,1464,1146],{"class":1069},[1040,1466,1149],{"class":1046},[1040,1468,1166],{"class":1077},[1040,1470,1155],{"class":1046},[1040,1472,1473],{"class":1042,"line":1092},[1040,1474,1173],{"class":1046},[1040,1476,1477],{"class":1042,"line":1103},[1040,1478,1479],{"class":1046},"  function authenticateWithGoogle() {\n",[1040,1481,1482],{"class":1042,"line":1184},[1040,1483,1173],{"class":1046},[1040,1485,1486,1488,1490],{"class":1042,"line":1325},[1040,1487,1106],{"class":1046},[1040,1489,1098],{"class":1050},[1040,1491,1054],{"class":1046},[1040,1493,1494,1496,1498,1500,1502,1504,1506,1508],{"class":1042,"line":1331},[1040,1495,1047],{"class":1046},[1040,1497,1098],{"class":1050},[1040,1499,1191],{"class":1069},[1040,1501,1074],{"class":1073},[1040,1503,1196],{"class":1077},[1040,1505,1199],{"class":1046},[1040,1507,1098],{"class":1050},[1040,1509,1054],{"class":1046},[924,1511,1513],{"id":1512},"authenticate-with-google","Authenticate with Google",[929,1515,1516,1517,1523,1524,1527],{},"We can start the rest of the Google Authentication process now in our authenticateWithGoogle.\nImplement this function to authorize the ",[1518,1519,1520],"a",{"href":1520,"rel":1521},"https:\u002F\u002Fwww.googleapis.com\u002Fauth\u002Fdrive",[1522],"nofollow"," scope with a ",[1037,1525,1526],{},"client_id"," using the variable we defined. Don't worry about the callback on success yet, we'll do that next.",[1030,1529,1531],{"className":1032,"code":1530,"language":1034,"meta":1035,"style":1035},"\u003Cscript>\n  var clientId = '720409271749-hqv3lb4u0q82t68vperem5oi3kosskol.apps.googleusercontent.com';\n  function onApiLoad() {\n    gapi.load('auth', authenticateWithGoogle);\n    gapi.load('picker');\n  }\n  function authenticateWithGoogle() {\n    window.gapi.auth.authorize({\n      'client_id': clientId,\n      'scope': ['https:\u002F\u002Fwww.googleapis.com\u002Fauth\u002Fdrive']\n    });\n  }\n\u003C\u002Fscript>\n\u003Cscript src=\"https:\u002F\u002Fapis.google.com\u002Fjs\u002Fapi.js?onload=onApiLoad\">\u003C\u002Fscript>\n",[1037,1532,1533,1541,1546,1550,1563,1575,1579,1583,1593,1601,1615,1621,1626,1635],{"__ignoreMap":1035},[1040,1534,1535,1537,1539],{"class":1042,"line":1043},[1040,1536,1047],{"class":1046},[1040,1538,1098],{"class":1050},[1040,1540,1054],{"class":1046},[1040,1542,1543],{"class":1042,"line":1057},[1040,1544,1545],{"class":1046},"  var clientId = '720409271749-hqv3lb4u0q82t68vperem5oi3kosskol.apps.googleusercontent.com';\n",[1040,1547,1548],{"class":1042,"line":1066},[1040,1549,1138],{"class":1046},[1040,1551,1552,1554,1556,1558,1560],{"class":1042,"line":1081},[1040,1553,1143],{"class":1046},[1040,1555,1146],{"class":1069},[1040,1557,1149],{"class":1046},[1040,1559,1152],{"class":1077},[1040,1561,1562],{"class":1046},", authenticateWithGoogle);\n",[1040,1564,1565,1567,1569,1571,1573],{"class":1042,"line":1092},[1040,1566,1143],{"class":1046},[1040,1568,1146],{"class":1069},[1040,1570,1149],{"class":1046},[1040,1572,1166],{"class":1077},[1040,1574,1155],{"class":1046},[1040,1576,1577],{"class":1042,"line":1103},[1040,1578,1173],{"class":1046},[1040,1580,1581],{"class":1042,"line":1184},[1040,1582,1479],{"class":1046},[1040,1584,1585,1588,1590],{"class":1042,"line":1325},[1040,1586,1587],{"class":1046},"    window.gapi.auth.",[1040,1589,1282],{"class":1069},[1040,1591,1592],{"class":1046},"({\n",[1040,1594,1595,1598],{"class":1042,"line":1331},[1040,1596,1597],{"class":1077},"      'client_id'",[1040,1599,1600],{"class":1046},": clientId,\n",[1040,1602,1604,1607,1610,1612],{"class":1042,"line":1603},10,[1040,1605,1606],{"class":1077},"      'scope'",[1040,1608,1609],{"class":1046},": [",[1040,1611,1309],{"class":1077},[1040,1613,1614],{"class":1046},"]\n",[1040,1616,1618],{"class":1042,"line":1617},11,[1040,1619,1620],{"class":1046},"    });\n",[1040,1622,1624],{"class":1042,"line":1623},12,[1040,1625,1173],{"class":1046},[1040,1627,1629,1631,1633],{"class":1042,"line":1628},13,[1040,1630,1106],{"class":1046},[1040,1632,1098],{"class":1050},[1040,1634,1054],{"class":1046},[1040,1636,1638,1640,1642,1644,1646,1648,1650,1652],{"class":1042,"line":1637},14,[1040,1639,1047],{"class":1046},[1040,1641,1098],{"class":1050},[1040,1643,1191],{"class":1069},[1040,1645,1074],{"class":1073},[1040,1647,1196],{"class":1077},[1040,1649,1199],{"class":1046},[1040,1651,1098],{"class":1050},[1040,1653,1054],{"class":1046},[924,1655,1657],{"id":1656},"handling-authentication","Handling Authentication",[929,1659,1660,1661,1664],{},"After we authenticate with Google with our API key, we can show our actual Picker! …assuming the authentication was successful.\nCreate a new handleAuthentication function that will be called after authentication.\nIn this function, save their ",[1037,1662,1663],{},"access_token"," to the accessToken variable if authentication was successful.",[1030,1666,1668],{"className":1032,"code":1667,"language":1034,"meta":1035,"style":1035},"\u003Cscript>\n  var clientId = '720409271749-hqv3lb4u0q82t68vperem5oi3kosskol.apps.googleusercontent.com';\n  var accessToken;\n  function onApiLoad() {\n    gapi.load('auth', authenticateWithGoogle);\n    gapi.load('picker');\n  }\n  function authenticateWithGoogle() {\n    window.gapi.auth.authorize({\n      'client_id': clientId,\n      'scope': ['https:\u002F\u002Fwww.googleapis.com\u002Fauth\u002Fdrive']},\n      handleAuthentication);\n  }\n  function handleAuthentication(authResult) {\n    if (authResult && !authResult.error) {\n      accessToken = authResult.access_token;\n    }\n  }\n\u003C\u002Fscript>\n\u003Cscript src=\"https:\u002F\u002Fapis.google.com\u002Fjs\u002Fapi.js?onload=onApiLoad\">\u003C\u002Fscript>\n",[1037,1669,1670,1678,1682,1687,1691,1703,1715,1719,1723,1731,1737,1748,1753,1757,1762,1776,1786,1792,1797,1806],{"__ignoreMap":1035},[1040,1671,1672,1674,1676],{"class":1042,"line":1043},[1040,1673,1047],{"class":1046},[1040,1675,1098],{"class":1050},[1040,1677,1054],{"class":1046},[1040,1679,1680],{"class":1042,"line":1057},[1040,1681,1545],{"class":1046},[1040,1683,1684],{"class":1042,"line":1066},[1040,1685,1686],{"class":1046},"  var accessToken;\n",[1040,1688,1689],{"class":1042,"line":1081},[1040,1690,1138],{"class":1046},[1040,1692,1693,1695,1697,1699,1701],{"class":1042,"line":1092},[1040,1694,1143],{"class":1046},[1040,1696,1146],{"class":1069},[1040,1698,1149],{"class":1046},[1040,1700,1152],{"class":1077},[1040,1702,1562],{"class":1046},[1040,1704,1705,1707,1709,1711,1713],{"class":1042,"line":1103},[1040,1706,1143],{"class":1046},[1040,1708,1146],{"class":1069},[1040,1710,1149],{"class":1046},[1040,1712,1166],{"class":1077},[1040,1714,1155],{"class":1046},[1040,1716,1717],{"class":1042,"line":1184},[1040,1718,1173],{"class":1046},[1040,1720,1721],{"class":1042,"line":1325},[1040,1722,1479],{"class":1046},[1040,1724,1725,1727,1729],{"class":1042,"line":1331},[1040,1726,1587],{"class":1046},[1040,1728,1282],{"class":1069},[1040,1730,1592],{"class":1046},[1040,1732,1733,1735],{"class":1042,"line":1603},[1040,1734,1597],{"class":1077},[1040,1736,1600],{"class":1046},[1040,1738,1739,1741,1743,1745],{"class":1042,"line":1617},[1040,1740,1606],{"class":1077},[1040,1742,1609],{"class":1046},[1040,1744,1309],{"class":1077},[1040,1746,1747],{"class":1046},"]},\n",[1040,1749,1750],{"class":1042,"line":1623},[1040,1751,1752],{"class":1046},"      handleAuthentication);\n",[1040,1754,1755],{"class":1042,"line":1628},[1040,1756,1173],{"class":1046},[1040,1758,1759],{"class":1042,"line":1637},[1040,1760,1761],{"class":1046},"  function handleAuthentication(authResult) {\n",[1040,1763,1765,1768,1770,1772,1774],{"class":1042,"line":1764},15,[1040,1766,1767],{"class":1069},"    if",[1040,1769,1377],{"class":1046},[1040,1771,1380],{"class":1073},[1040,1773,1383],{"class":1073},[1040,1775,1386],{"class":1046},[1040,1777,1779,1782,1784],{"class":1042,"line":1778},16,[1040,1780,1781],{"class":1046},"      accessToken ",[1040,1783,1074],{"class":1073},[1040,1785,1396],{"class":1046},[1040,1787,1789],{"class":1042,"line":1788},17,[1040,1790,1791],{"class":1046},"    }\n",[1040,1793,1795],{"class":1042,"line":1794},18,[1040,1796,1173],{"class":1046},[1040,1798,1800,1802,1804],{"class":1042,"line":1799},19,[1040,1801,1106],{"class":1046},[1040,1803,1098],{"class":1050},[1040,1805,1054],{"class":1046},[1040,1807,1809,1811,1813,1815,1817,1819,1821,1823],{"class":1042,"line":1808},20,[1040,1810,1047],{"class":1046},[1040,1812,1098],{"class":1050},[1040,1814,1191],{"class":1069},[1040,1816,1074],{"class":1073},[1040,1818,1196],{"class":1077},[1040,1820,1199],{"class":1046},[1040,1822,1098],{"class":1050},[1040,1824,1054],{"class":1046},[924,1826,1828],{"id":1827},"basic-picker","Basic Picker",[929,1830,1831],{},"After successfully authenticating is a perfect time to set up our picker! Create a new setupPicker function which is executed after successful authentication. In this function, build out a new picker using our saved accessToken and render it.",[1030,1833,1835],{"className":1032,"code":1834,"language":1034,"meta":1035,"style":1035},"\u003Cscript>\n  var clientId = '720409271749-hqv3lb4u0q82t68vperem5oi3kosskol.apps.googleusercontent.com';\n  var developerKey = 'AIzaSyBTEWsJ4aXdoOzB4ey81eX9-ja7HejL4Qc';\n  var accessToken;\n  function onApiLoad() {\n    gapi.load('auth', authenticateWithGoogle);\n    gapi.load('picker');\n  }\n  function authenticateWithGoogle() {\n    window.gapi.auth.authorize({\n      'client_id': clientId,\n      'scope': ['https:\u002F\u002Fwww.googleapis.com\u002Fauth\u002Fdrive']\n    }, handleAuthentication);\n  }\n  function handleAuthentication(result) {\n    if(result && !result.error) {\n      accessToken = result.access_token;\n      setupPicker();\n    }\n  }\n  function setupPicker() {\n    var picker = new google.picker.PickerBuilder()\n    .setOAuthToken(accessToken)\n    .setDeveloperKey(developerKey)\n    .build();\n    picker.setVisible(true);\n  }\n\u003C\u002Fscript>\n\u003Cscript src=\"https:\u002F\u002Fapis.google.com\u002Fjs\u002Fapi.js?onload=onApiLoad\">\u003C\u002Fscript>\n",[1037,1836,1837,1845,1849,1854,1858,1862,1874,1886,1890,1894,1902,1908,1918,1923,1927,1932,1946,1955,1962,1966,1970,1976,1996,2008,2019,2029,2046,2051,2060],{"__ignoreMap":1035},[1040,1838,1839,1841,1843],{"class":1042,"line":1043},[1040,1840,1047],{"class":1046},[1040,1842,1098],{"class":1050},[1040,1844,1054],{"class":1046},[1040,1846,1847],{"class":1042,"line":1057},[1040,1848,1545],{"class":1046},[1040,1850,1851],{"class":1042,"line":1066},[1040,1852,1853],{"class":1046},"  var developerKey = 'AIzaSyBTEWsJ4aXdoOzB4ey81eX9-ja7HejL4Qc';\n",[1040,1855,1856],{"class":1042,"line":1081},[1040,1857,1686],{"class":1046},[1040,1859,1860],{"class":1042,"line":1092},[1040,1861,1138],{"class":1046},[1040,1863,1864,1866,1868,1870,1872],{"class":1042,"line":1103},[1040,1865,1143],{"class":1046},[1040,1867,1146],{"class":1069},[1040,1869,1149],{"class":1046},[1040,1871,1152],{"class":1077},[1040,1873,1562],{"class":1046},[1040,1875,1876,1878,1880,1882,1884],{"class":1042,"line":1184},[1040,1877,1143],{"class":1046},[1040,1879,1146],{"class":1069},[1040,1881,1149],{"class":1046},[1040,1883,1166],{"class":1077},[1040,1885,1155],{"class":1046},[1040,1887,1888],{"class":1042,"line":1325},[1040,1889,1173],{"class":1046},[1040,1891,1892],{"class":1042,"line":1331},[1040,1893,1479],{"class":1046},[1040,1895,1896,1898,1900],{"class":1042,"line":1603},[1040,1897,1587],{"class":1046},[1040,1899,1282],{"class":1069},[1040,1901,1592],{"class":1046},[1040,1903,1904,1906],{"class":1042,"line":1617},[1040,1905,1597],{"class":1077},[1040,1907,1600],{"class":1046},[1040,1909,1910,1912,1914,1916],{"class":1042,"line":1623},[1040,1911,1606],{"class":1077},[1040,1913,1609],{"class":1046},[1040,1915,1309],{"class":1077},[1040,1917,1614],{"class":1046},[1040,1919,1920],{"class":1042,"line":1628},[1040,1921,1922],{"class":1046},"    }, handleAuthentication);\n",[1040,1924,1925],{"class":1042,"line":1637},[1040,1926,1173],{"class":1046},[1040,1928,1929],{"class":1042,"line":1764},[1040,1930,1931],{"class":1046},"  function handleAuthentication(result) {\n",[1040,1933,1934,1936,1939,1941,1943],{"class":1042,"line":1778},[1040,1935,1767],{"class":1069},[1040,1937,1938],{"class":1046},"(result ",[1040,1940,1380],{"class":1073},[1040,1942,1383],{"class":1073},[1040,1944,1945],{"class":1046},"result.error) {\n",[1040,1947,1948,1950,1952],{"class":1042,"line":1788},[1040,1949,1781],{"class":1046},[1040,1951,1074],{"class":1073},[1040,1953,1954],{"class":1046}," result.access_token;\n",[1040,1956,1957,1960],{"class":1042,"line":1794},[1040,1958,1959],{"class":1069},"      setupPicker",[1040,1961,1404],{"class":1046},[1040,1963,1964],{"class":1042,"line":1799},[1040,1965,1791],{"class":1046},[1040,1967,1968],{"class":1042,"line":1808},[1040,1969,1173],{"class":1046},[1040,1971,1973],{"class":1042,"line":1972},21,[1040,1974,1975],{"class":1046},"  function setupPicker() {\n",[1040,1977,1979,1982,1984,1987,1990,1993],{"class":1042,"line":1978},22,[1040,1980,1981],{"class":1046},"    var picker ",[1040,1983,1074],{"class":1073},[1040,1985,1986],{"class":1073}," new",[1040,1988,1989],{"class":1046}," google.picker.",[1040,1991,1992],{"class":1069},"PickerBuilder",[1040,1994,1995],{"class":1046},"()\n",[1040,1997,1999,2002,2005],{"class":1042,"line":1998},23,[1040,2000,2001],{"class":1046},"    .",[1040,2003,2004],{"class":1069},"setOAuthToken",[1040,2006,2007],{"class":1046},"(accessToken)\n",[1040,2009,2011,2013,2016],{"class":1042,"line":2010},24,[1040,2012,2001],{"class":1046},[1040,2014,2015],{"class":1069},"setDeveloperKey",[1040,2017,2018],{"class":1046},"(developerKey)\n",[1040,2020,2022,2024,2027],{"class":1042,"line":2021},25,[1040,2023,2001],{"class":1046},[1040,2025,2026],{"class":1069},"build",[1040,2028,1404],{"class":1046},[1040,2030,2032,2035,2038,2040,2044],{"class":1042,"line":2031},26,[1040,2033,2034],{"class":1046},"    picker.",[1040,2036,2037],{"class":1069},"setVisible",[1040,2039,1149],{"class":1046},[1040,2041,2043],{"class":2042},"sj4cs","true",[1040,2045,1155],{"class":1046},[1040,2047,2049],{"class":1042,"line":2048},27,[1040,2050,1173],{"class":1046},[1040,2052,2054,2056,2058],{"class":1042,"line":2053},28,[1040,2055,1106],{"class":1046},[1040,2057,1098],{"class":1050},[1040,2059,1054],{"class":1046},[1040,2061,2063,2065,2067,2069,2071,2073,2075,2077],{"class":1042,"line":2062},29,[1040,2064,1047],{"class":1046},[1040,2066,1098],{"class":1050},[1040,2068,1191],{"class":1069},[1040,2070,1074],{"class":1073},[1040,2072,1196],{"class":1077},[1040,2074,1199],{"class":1046},[1040,2076,1098],{"class":1050},[1040,2078,1054],{"class":1046},[924,2080,2082],{"id":2081},"adding-views","Adding Views",[929,2084,2085],{},"We've successfully rendered our Picker, but it's just an empty window. Let's add a new view to it so it does something.",[929,2087,2088,2089,2092],{},"Update ",[1037,2090,2091],{},"setupPicker()"," to give our Picker the ability to upload files to Google Drive.",[1030,2094,2096],{"className":1032,"code":2095,"language":1034,"meta":1035,"style":1035},"\u003Cscript>\n  var clientId = '720409271749-hqv3lb4u0q82t68vperem5oi3kosskol.apps.googleusercontent.com';\n  var developerKey = 'AIzaSyBTEWsJ4aXdoOzB4ey81eX9-ja7HejL4Qc';\n  var accessToken;\n  function onApiLoad() {\n    gapi.load('auth', authenticateWithGoogle);\n    gapi.load('picker');\n  }\n  function authenticateWithGoogle() {\n    window.gapi.auth.authorize({\n      'client_id': clientId,\n      'scope': ['https:\u002F\u002Fwww.googleapis.com\u002Fauth\u002Fdrive']\n    }, handleAuthentication);\n  }\n  function handleAuthentication(result) {\n    if(result && !result.error) {\n      accessToken = result.access_token;\n      setupPicker();\n    }\n  }\n  function setupPicker() {\n    var picker = new google.picker.PickerBuilder()\n      .addView(new google.picker.DocsUploadView())\n      .setOAuthToken(accessToken)\n      .setDeveloperKey(developerKey)\n      .build();\n    picker.setVisible(true);\n  }\n\u003C\u002Fscript>\n\u003Cscript src=\"https:\u002F\u002Fapis.google.com\u002Fjs\u002Fapi.js?onload=onApiLoad\">\u003C\u002Fscript>\n",[1037,2097,2098,2106,2110,2114,2118,2122,2134,2146,2150,2154,2162,2168,2178,2182,2186,2190,2202,2210,2216,2220,2224,2228,2242,2263,2271,2279,2287,2299,2303,2311],{"__ignoreMap":1035},[1040,2099,2100,2102,2104],{"class":1042,"line":1043},[1040,2101,1047],{"class":1046},[1040,2103,1098],{"class":1050},[1040,2105,1054],{"class":1046},[1040,2107,2108],{"class":1042,"line":1057},[1040,2109,1545],{"class":1046},[1040,2111,2112],{"class":1042,"line":1066},[1040,2113,1853],{"class":1046},[1040,2115,2116],{"class":1042,"line":1081},[1040,2117,1686],{"class":1046},[1040,2119,2120],{"class":1042,"line":1092},[1040,2121,1138],{"class":1046},[1040,2123,2124,2126,2128,2130,2132],{"class":1042,"line":1103},[1040,2125,1143],{"class":1046},[1040,2127,1146],{"class":1069},[1040,2129,1149],{"class":1046},[1040,2131,1152],{"class":1077},[1040,2133,1562],{"class":1046},[1040,2135,2136,2138,2140,2142,2144],{"class":1042,"line":1184},[1040,2137,1143],{"class":1046},[1040,2139,1146],{"class":1069},[1040,2141,1149],{"class":1046},[1040,2143,1166],{"class":1077},[1040,2145,1155],{"class":1046},[1040,2147,2148],{"class":1042,"line":1325},[1040,2149,1173],{"class":1046},[1040,2151,2152],{"class":1042,"line":1331},[1040,2153,1479],{"class":1046},[1040,2155,2156,2158,2160],{"class":1042,"line":1603},[1040,2157,1587],{"class":1046},[1040,2159,1282],{"class":1069},[1040,2161,1592],{"class":1046},[1040,2163,2164,2166],{"class":1042,"line":1617},[1040,2165,1597],{"class":1077},[1040,2167,1600],{"class":1046},[1040,2169,2170,2172,2174,2176],{"class":1042,"line":1623},[1040,2171,1606],{"class":1077},[1040,2173,1609],{"class":1046},[1040,2175,1309],{"class":1077},[1040,2177,1614],{"class":1046},[1040,2179,2180],{"class":1042,"line":1628},[1040,2181,1922],{"class":1046},[1040,2183,2184],{"class":1042,"line":1637},[1040,2185,1173],{"class":1046},[1040,2187,2188],{"class":1042,"line":1764},[1040,2189,1931],{"class":1046},[1040,2191,2192,2194,2196,2198,2200],{"class":1042,"line":1778},[1040,2193,1767],{"class":1069},[1040,2195,1938],{"class":1046},[1040,2197,1380],{"class":1073},[1040,2199,1383],{"class":1073},[1040,2201,1945],{"class":1046},[1040,2203,2204,2206,2208],{"class":1042,"line":1788},[1040,2205,1781],{"class":1046},[1040,2207,1074],{"class":1073},[1040,2209,1954],{"class":1046},[1040,2211,2212,2214],{"class":1042,"line":1794},[1040,2213,1959],{"class":1069},[1040,2215,1404],{"class":1046},[1040,2217,2218],{"class":1042,"line":1799},[1040,2219,1791],{"class":1046},[1040,2221,2222],{"class":1042,"line":1808},[1040,2223,1173],{"class":1046},[1040,2225,2226],{"class":1042,"line":1972},[1040,2227,1975],{"class":1046},[1040,2229,2230,2232,2234,2236,2238,2240],{"class":1042,"line":1978},[1040,2231,1981],{"class":1046},[1040,2233,1074],{"class":1073},[1040,2235,1986],{"class":1073},[1040,2237,1989],{"class":1046},[1040,2239,1992],{"class":1069},[1040,2241,1995],{"class":1046},[1040,2243,2244,2247,2250,2252,2255,2257,2260],{"class":1042,"line":1998},[1040,2245,2246],{"class":1046},"      .",[1040,2248,2249],{"class":1069},"addView",[1040,2251,1149],{"class":1046},[1040,2253,2254],{"class":1073},"new",[1040,2256,1989],{"class":1046},[1040,2258,2259],{"class":1069},"DocsUploadView",[1040,2261,2262],{"class":1046},"())\n",[1040,2264,2265,2267,2269],{"class":1042,"line":2010},[1040,2266,2246],{"class":1046},[1040,2268,2004],{"class":1069},[1040,2270,2007],{"class":1046},[1040,2272,2273,2275,2277],{"class":1042,"line":2021},[1040,2274,2246],{"class":1046},[1040,2276,2015],{"class":1069},[1040,2278,2018],{"class":1046},[1040,2280,2281,2283,2285],{"class":1042,"line":2031},[1040,2282,2246],{"class":1046},[1040,2284,2026],{"class":1069},[1040,2286,1404],{"class":1046},[1040,2288,2289,2291,2293,2295,2297],{"class":1042,"line":2048},[1040,2290,2034],{"class":1046},[1040,2292,2037],{"class":1069},[1040,2294,1149],{"class":1046},[1040,2296,2043],{"class":2042},[1040,2298,1155],{"class":1046},[1040,2300,2301],{"class":1042,"line":2053},[1040,2302,1173],{"class":1046},[1040,2304,2305,2307,2309],{"class":1042,"line":2062},[1040,2306,1106],{"class":1046},[1040,2308,1098],{"class":1050},[1040,2310,1054],{"class":1046},[1040,2312,2314,2316,2318,2320,2322,2324,2326,2328],{"class":1042,"line":2313},30,[1040,2315,1047],{"class":1046},[1040,2317,1098],{"class":1050},[1040,2319,1191],{"class":1069},[1040,2321,1074],{"class":1073},[1040,2323,1196],{"class":1077},[1040,2325,1199],{"class":1046},[1040,2327,1098],{"class":1050},[1040,2329,1054],{"class":1046},[929,2331,2332],{},"Let's give the Picker the ability to list files that a user can select.",[929,2334,2335],{},"Add the appropriate view to the Picker.",[1030,2337,2339],{"className":1032,"code":2338,"language":1034,"meta":1035,"style":1035},"\u003Cscript>\n  var clientId = '720409271749-hqv3lb4u0q82t68vperem5oi3kosskol.apps.googleusercontent.com';\n  var developerKey = 'AIzaSyBTEWsJ4aXdoOzB4ey81eX9-ja7HejL4Qc';\n  var accessToken;\n  function onApiLoad() {\n    gapi.load('auth', authenticateWithGoogle);\n    gapi.load('picker');\n  }\n  function authenticateWithGoogle() {\n    window.gapi.auth.authorize({\n      'client_id': clientId,\n      'scope': ['https:\u002F\u002Fwww.googleapis.com\u002Fauth\u002Fdrive']\n    }, handleAuthentication);\n  }\n  function handleAuthentication(result) {\n    if(result && !result.error) {\n      accessToken = result.access_token;\n      setupPicker();\n    }\n  }\n  function setupPicker() {\n    var picker = new google.picker.PickerBuilder()\n      .setOAuthToken(accessToken)\n      .setDeveloperKey(developerKey)\n      .addView(new google.picker.DocsUploadView())\n      .addView(new google.picker.DocsView())\n      .build();\n    picker.setVisible(true);\n  }\n\u003C\u002Fscript>\n\u003Cscript src=\"https:\u002F\u002Fapis.google.com\u002Fjs\u002Fapi.js?onload=onApiLoad\">\u003C\u002Fscript>\n",[1037,2340,2341,2349,2353,2357,2361,2365,2377,2389,2393,2397,2405,2411,2421,2425,2429,2433,2445,2453,2459,2463,2467,2471,2485,2493,2501,2517,2534,2542,2554,2558,2566],{"__ignoreMap":1035},[1040,2342,2343,2345,2347],{"class":1042,"line":1043},[1040,2344,1047],{"class":1046},[1040,2346,1098],{"class":1050},[1040,2348,1054],{"class":1046},[1040,2350,2351],{"class":1042,"line":1057},[1040,2352,1545],{"class":1046},[1040,2354,2355],{"class":1042,"line":1066},[1040,2356,1853],{"class":1046},[1040,2358,2359],{"class":1042,"line":1081},[1040,2360,1686],{"class":1046},[1040,2362,2363],{"class":1042,"line":1092},[1040,2364,1138],{"class":1046},[1040,2366,2367,2369,2371,2373,2375],{"class":1042,"line":1103},[1040,2368,1143],{"class":1046},[1040,2370,1146],{"class":1069},[1040,2372,1149],{"class":1046},[1040,2374,1152],{"class":1077},[1040,2376,1562],{"class":1046},[1040,2378,2379,2381,2383,2385,2387],{"class":1042,"line":1184},[1040,2380,1143],{"class":1046},[1040,2382,1146],{"class":1069},[1040,2384,1149],{"class":1046},[1040,2386,1166],{"class":1077},[1040,2388,1155],{"class":1046},[1040,2390,2391],{"class":1042,"line":1325},[1040,2392,1173],{"class":1046},[1040,2394,2395],{"class":1042,"line":1331},[1040,2396,1479],{"class":1046},[1040,2398,2399,2401,2403],{"class":1042,"line":1603},[1040,2400,1587],{"class":1046},[1040,2402,1282],{"class":1069},[1040,2404,1592],{"class":1046},[1040,2406,2407,2409],{"class":1042,"line":1617},[1040,2408,1597],{"class":1077},[1040,2410,1600],{"class":1046},[1040,2412,2413,2415,2417,2419],{"class":1042,"line":1623},[1040,2414,1606],{"class":1077},[1040,2416,1609],{"class":1046},[1040,2418,1309],{"class":1077},[1040,2420,1614],{"class":1046},[1040,2422,2423],{"class":1042,"line":1628},[1040,2424,1922],{"class":1046},[1040,2426,2427],{"class":1042,"line":1637},[1040,2428,1173],{"class":1046},[1040,2430,2431],{"class":1042,"line":1764},[1040,2432,1931],{"class":1046},[1040,2434,2435,2437,2439,2441,2443],{"class":1042,"line":1778},[1040,2436,1767],{"class":1069},[1040,2438,1938],{"class":1046},[1040,2440,1380],{"class":1073},[1040,2442,1383],{"class":1073},[1040,2444,1945],{"class":1046},[1040,2446,2447,2449,2451],{"class":1042,"line":1788},[1040,2448,1781],{"class":1046},[1040,2450,1074],{"class":1073},[1040,2452,1954],{"class":1046},[1040,2454,2455,2457],{"class":1042,"line":1794},[1040,2456,1959],{"class":1069},[1040,2458,1404],{"class":1046},[1040,2460,2461],{"class":1042,"line":1799},[1040,2462,1791],{"class":1046},[1040,2464,2465],{"class":1042,"line":1808},[1040,2466,1173],{"class":1046},[1040,2468,2469],{"class":1042,"line":1972},[1040,2470,1975],{"class":1046},[1040,2472,2473,2475,2477,2479,2481,2483],{"class":1042,"line":1978},[1040,2474,1981],{"class":1046},[1040,2476,1074],{"class":1073},[1040,2478,1986],{"class":1073},[1040,2480,1989],{"class":1046},[1040,2482,1992],{"class":1069},[1040,2484,1995],{"class":1046},[1040,2486,2487,2489,2491],{"class":1042,"line":1998},[1040,2488,2246],{"class":1046},[1040,2490,2004],{"class":1069},[1040,2492,2007],{"class":1046},[1040,2494,2495,2497,2499],{"class":1042,"line":2010},[1040,2496,2246],{"class":1046},[1040,2498,2015],{"class":1069},[1040,2500,2018],{"class":1046},[1040,2502,2503,2505,2507,2509,2511,2513,2515],{"class":1042,"line":2021},[1040,2504,2246],{"class":1046},[1040,2506,2249],{"class":1069},[1040,2508,1149],{"class":1046},[1040,2510,2254],{"class":1073},[1040,2512,1989],{"class":1046},[1040,2514,2259],{"class":1069},[1040,2516,2262],{"class":1046},[1040,2518,2519,2521,2523,2525,2527,2529,2532],{"class":1042,"line":2031},[1040,2520,2246],{"class":1046},[1040,2522,2249],{"class":1069},[1040,2524,1149],{"class":1046},[1040,2526,2254],{"class":1073},[1040,2528,1989],{"class":1046},[1040,2530,2531],{"class":1069},"DocsView",[1040,2533,2262],{"class":1046},[1040,2535,2536,2538,2540],{"class":1042,"line":2048},[1040,2537,2246],{"class":1046},[1040,2539,2026],{"class":1069},[1040,2541,1404],{"class":1046},[1040,2543,2544,2546,2548,2550,2552],{"class":1042,"line":2053},[1040,2545,2034],{"class":1046},[1040,2547,2037],{"class":1069},[1040,2549,1149],{"class":1046},[1040,2551,2043],{"class":2042},[1040,2553,1155],{"class":1046},[1040,2555,2556],{"class":1042,"line":2062},[1040,2557,1173],{"class":1046},[1040,2559,2560,2562,2564],{"class":1042,"line":2313},[1040,2561,1106],{"class":1046},[1040,2563,1098],{"class":1050},[1040,2565,1054],{"class":1046},[1040,2567,2569,2571,2573,2575,2577,2579,2581,2583],{"class":1042,"line":2568},31,[1040,2570,1047],{"class":1046},[1040,2572,1098],{"class":1050},[1040,2574,1191],{"class":1069},[1040,2576,1074],{"class":1073},[1040,2578,1196],{"class":1077},[1040,2580,1199],{"class":1046},[1040,2582,1098],{"class":1050},[1040,2584,1054],{"class":1046},[924,2586,2588],{"id":2587},"setting-a-callback-function","Setting a Callback Function",[929,2590,2591],{},"We've given users the ability to view and select files with the DocsView, but clicking the select button doesn't do anything yet.",[929,2593,2594],{},"Define a callback function called myCallback() and set that as the Picker callback.",[1030,2596,2598],{"className":1032,"code":2597,"language":1034,"meta":1035,"style":1035},"\u003Cscript>\n  var clientId = '720409271749-hqv3lb4u0q82t68vperem5oi3kosskol.apps.googleusercontent.com';\n  var developerKey = 'AIzaSyBTEWsJ4aXdoOzB4ey81eX9-ja7HejL4Qc';\n  var accessToken;\n  function onApiLoad() {\n    gapi.load('auth', authenticateWithGoogle);\n    gapi.load('picker');\n  }\n  function authenticateWithGoogle() {\n    window.gapi.auth.authorize({\n      'client_id': clientId,\n      'scope': ['https:\u002F\u002Fwww.googleapis.com\u002Fauth\u002Fdrive']\n    }, handleAuthentication);\n  }\n  function handleAuthentication(result) {\n    if(result && !result.error) {\n      accessToken = result.access_token;\n      setupPicker();\n    }\n  }\n  function setupPicker() {\n    var picker = new google.picker.PickerBuilder()\n      .setOAuthToken(accessToken)\n      .setDeveloperKey(developerKey)\n      .addView(new google.picker.DocsUploadView())\n      .addView(new google.picker.DocsView())\n      .setCallback(myCallback)\n      .build();\n    picker.setVisible(true);\n  }\n  function myCallback(data) {\n\n  }\n\u003C\u002Fscript>\n\u003Cscript src=\"https:\u002F\u002Fapis.google.com\u002Fjs\u002Fapi.js?onload=onApiLoad\">\u003C\u002Fscript>\n",[1037,2599,2600,2608,2612,2616,2620,2624,2636,2648,2652,2656,2664,2670,2680,2684,2688,2692,2704,2712,2718,2722,2726,2730,2744,2752,2760,2776,2792,2802,2810,2822,2826,2831,2838,2843,2852],{"__ignoreMap":1035},[1040,2601,2602,2604,2606],{"class":1042,"line":1043},[1040,2603,1047],{"class":1046},[1040,2605,1098],{"class":1050},[1040,2607,1054],{"class":1046},[1040,2609,2610],{"class":1042,"line":1057},[1040,2611,1545],{"class":1046},[1040,2613,2614],{"class":1042,"line":1066},[1040,2615,1853],{"class":1046},[1040,2617,2618],{"class":1042,"line":1081},[1040,2619,1686],{"class":1046},[1040,2621,2622],{"class":1042,"line":1092},[1040,2623,1138],{"class":1046},[1040,2625,2626,2628,2630,2632,2634],{"class":1042,"line":1103},[1040,2627,1143],{"class":1046},[1040,2629,1146],{"class":1069},[1040,2631,1149],{"class":1046},[1040,2633,1152],{"class":1077},[1040,2635,1562],{"class":1046},[1040,2637,2638,2640,2642,2644,2646],{"class":1042,"line":1184},[1040,2639,1143],{"class":1046},[1040,2641,1146],{"class":1069},[1040,2643,1149],{"class":1046},[1040,2645,1166],{"class":1077},[1040,2647,1155],{"class":1046},[1040,2649,2650],{"class":1042,"line":1325},[1040,2651,1173],{"class":1046},[1040,2653,2654],{"class":1042,"line":1331},[1040,2655,1479],{"class":1046},[1040,2657,2658,2660,2662],{"class":1042,"line":1603},[1040,2659,1587],{"class":1046},[1040,2661,1282],{"class":1069},[1040,2663,1592],{"class":1046},[1040,2665,2666,2668],{"class":1042,"line":1617},[1040,2667,1597],{"class":1077},[1040,2669,1600],{"class":1046},[1040,2671,2672,2674,2676,2678],{"class":1042,"line":1623},[1040,2673,1606],{"class":1077},[1040,2675,1609],{"class":1046},[1040,2677,1309],{"class":1077},[1040,2679,1614],{"class":1046},[1040,2681,2682],{"class":1042,"line":1628},[1040,2683,1922],{"class":1046},[1040,2685,2686],{"class":1042,"line":1637},[1040,2687,1173],{"class":1046},[1040,2689,2690],{"class":1042,"line":1764},[1040,2691,1931],{"class":1046},[1040,2693,2694,2696,2698,2700,2702],{"class":1042,"line":1778},[1040,2695,1767],{"class":1069},[1040,2697,1938],{"class":1046},[1040,2699,1380],{"class":1073},[1040,2701,1383],{"class":1073},[1040,2703,1945],{"class":1046},[1040,2705,2706,2708,2710],{"class":1042,"line":1788},[1040,2707,1781],{"class":1046},[1040,2709,1074],{"class":1073},[1040,2711,1954],{"class":1046},[1040,2713,2714,2716],{"class":1042,"line":1794},[1040,2715,1959],{"class":1069},[1040,2717,1404],{"class":1046},[1040,2719,2720],{"class":1042,"line":1799},[1040,2721,1791],{"class":1046},[1040,2723,2724],{"class":1042,"line":1808},[1040,2725,1173],{"class":1046},[1040,2727,2728],{"class":1042,"line":1972},[1040,2729,1975],{"class":1046},[1040,2731,2732,2734,2736,2738,2740,2742],{"class":1042,"line":1978},[1040,2733,1981],{"class":1046},[1040,2735,1074],{"class":1073},[1040,2737,1986],{"class":1073},[1040,2739,1989],{"class":1046},[1040,2741,1992],{"class":1069},[1040,2743,1995],{"class":1046},[1040,2745,2746,2748,2750],{"class":1042,"line":1998},[1040,2747,2246],{"class":1046},[1040,2749,2004],{"class":1069},[1040,2751,2007],{"class":1046},[1040,2753,2754,2756,2758],{"class":1042,"line":2010},[1040,2755,2246],{"class":1046},[1040,2757,2015],{"class":1069},[1040,2759,2018],{"class":1046},[1040,2761,2762,2764,2766,2768,2770,2772,2774],{"class":1042,"line":2021},[1040,2763,2246],{"class":1046},[1040,2765,2249],{"class":1069},[1040,2767,1149],{"class":1046},[1040,2769,2254],{"class":1073},[1040,2771,1989],{"class":1046},[1040,2773,2259],{"class":1069},[1040,2775,2262],{"class":1046},[1040,2777,2778,2780,2782,2784,2786,2788,2790],{"class":1042,"line":2031},[1040,2779,2246],{"class":1046},[1040,2781,2249],{"class":1069},[1040,2783,1149],{"class":1046},[1040,2785,2254],{"class":1073},[1040,2787,1989],{"class":1046},[1040,2789,2531],{"class":1069},[1040,2791,2262],{"class":1046},[1040,2793,2794,2796,2799],{"class":1042,"line":2048},[1040,2795,2246],{"class":1046},[1040,2797,2798],{"class":1069},"setCallback",[1040,2800,2801],{"class":1046},"(myCallback)\n",[1040,2803,2804,2806,2808],{"class":1042,"line":2053},[1040,2805,2246],{"class":1046},[1040,2807,2026],{"class":1069},[1040,2809,1404],{"class":1046},[1040,2811,2812,2814,2816,2818,2820],{"class":1042,"line":2062},[1040,2813,2034],{"class":1046},[1040,2815,2037],{"class":1069},[1040,2817,1149],{"class":1046},[1040,2819,2043],{"class":2042},[1040,2821,1155],{"class":1046},[1040,2823,2824],{"class":1042,"line":2313},[1040,2825,1173],{"class":1046},[1040,2827,2828],{"class":1042,"line":2568},[1040,2829,2830],{"class":1046},"  function myCallback(data) {\n",[1040,2832,2834],{"class":1042,"line":2833},32,[1040,2835,2837],{"emptyLinePlaceholder":2836},true,"\n",[1040,2839,2841],{"class":1042,"line":2840},33,[1040,2842,1173],{"class":1046},[1040,2844,2846,2848,2850],{"class":1042,"line":2845},34,[1040,2847,1106],{"class":1046},[1040,2849,1098],{"class":1050},[1040,2851,1054],{"class":1046},[1040,2853,2855,2857,2859,2861,2863,2865,2867,2869],{"class":1042,"line":2854},35,[1040,2856,1047],{"class":1046},[1040,2858,1098],{"class":1050},[1040,2860,1191],{"class":1069},[1040,2862,1074],{"class":1073},[1040,2864,1196],{"class":1077},[1040,2866,1199],{"class":1046},[1040,2868,1098],{"class":1050},[1040,2870,1054],{"class":1046},[924,2872,2588],{"id":2873},"setting-a-callback-function-1",[929,2875,2591],{},[929,2877,2594],{},[929,2879,2880],{},[1037,2881,1034],{},[924,2883,2885],{"id":2884},"accessing-file-metadata","Accessing File Metadata",[929,2887,2888],{},"What good is a callback function if it doesn't do anything?",[929,2890,2891],{},"Update myCallback to alert the name of the first file passed in.",[929,2893,2894,2895,2898],{},"[code 1=\"myCallback(data)\" 2=\"{\" 3=\"alert(data.docs",[1040,2896,2897],{},"0\" language=\"function\"",".name);\n}",[1030,2900,2905],{"className":2901,"code":2903,"language":2904},[2902],"language-text","\n## Handling Picker Actions\n\nThe callback function gets triggered when an event occurs in the Picker, not just selecting files.\n\nUpdate myCallback to only alert the file name if the user clicked Select in the Picker modal.\n\n```js\nfunction myCallback(data) {\n  if(data.action == google.picker.Action.PICKED) {\n    alert(data.docs[0].name);\n  }\n}\n","text",[1037,2906,2903],{"__ignoreMap":1035},[924,2908,2910],{"id":2909},"handling-picker-actions-part-2","Handling Picker Actions, Part 2",[929,2912,2913],{},"Remember, multiple events can trigger the callback function, so we need to react differently based on what event occurred.",[929,2915,2916],{},"Update myCallback to alert goodbye when the user clicks the Cancel button.",[1030,2918,2920],{"className":1032,"code":2919,"language":1034,"meta":1035,"style":1035},"function myCallback(data) {\n  if (data.action == google.picker.Action.PICKED) {\n    alert(data.docs[0].name);\n  } else if (data.action == google.picker.Action.CANCEL) {\n    alert('goodbye');\n  }\n}\n",[1037,2921,2922,2936,2954,2968,2990,3001,3005],{"__ignoreMap":1035},[1040,2923,2924,2926,2929,2931,2934],{"class":1042,"line":1043},[1040,2925,1220],{"class":1073},[1040,2927,2928],{"class":1069}," myCallback",[1040,2930,1149],{"class":1046},[1040,2932,2933],{"class":1365},"data",[1040,2935,1369],{"class":1046},[1040,2937,2938,2940,2943,2946,2949,2952],{"class":1042,"line":1057},[1040,2939,1374],{"class":1073},[1040,2941,2942],{"class":1046}," (data.action ",[1040,2944,2945],{"class":1073},"==",[1040,2947,2948],{"class":1046}," google.picker.Action.",[1040,2950,2951],{"class":2042},"PICKED",[1040,2953,1369],{"class":1046},[1040,2955,2956,2959,2962,2965],{"class":1042,"line":1066},[1040,2957,2958],{"class":1069},"    alert",[1040,2960,2961],{"class":1046},"(data.docs[",[1040,2963,2964],{"class":2042},"0",[1040,2966,2967],{"class":1046},"].name);\n",[1040,2969,2970,2973,2976,2979,2981,2983,2985,2988],{"class":1042,"line":1081},[1040,2971,2972],{"class":1046},"  } ",[1040,2974,2975],{"class":1073},"else",[1040,2977,2978],{"class":1073}," if",[1040,2980,2942],{"class":1046},[1040,2982,2945],{"class":1073},[1040,2984,2948],{"class":1046},[1040,2986,2987],{"class":2042},"CANCEL",[1040,2989,1369],{"class":1046},[1040,2991,2992,2994,2996,2999],{"class":1042,"line":1092},[1040,2993,2958],{"class":1069},[1040,2995,1149],{"class":1046},[1040,2997,2998],{"class":1077},"'goodbye'",[1040,3000,1155],{"class":1046},[1040,3002,3003],{"class":1042,"line":1103},[1040,3004,1173],{"class":1046},[1040,3006,3007],{"class":1042,"line":1184},[1040,3008,1257],{"class":1046},[924,3010,3012],{"id":3011},"enabling-new-features","Enabling New Features",[929,3014,3015],{},"In this particular Picker example, we only have one view, so the navigation sidebar isn't necessary. Fortunately, there's a feature we can enable that hides the navigation.",[929,3017,3018],{},"Update the Picker so that the navigation is hidden.",[1030,3020,3022],{"className":1032,"code":3021,"language":1034,"meta":1035,"style":1035},"function setupPicker() {\n  var picker = new google.picker.PickerBuilder()\n    .setOAuthToken(accessToken)\n    .setDeveloperKey(developerKey)\n    .addView(new google.picker.DocsUploadView())\n    .enableFeature(google.picker.Feature.NAV_HIDDEN)\n    .setCallback(myCallback)\n    .build();\n  picker.setVisible(true);\n}\n",[1037,3023,3024,3033,3051,3059,3067,3083,3099,3107,3115,3128],{"__ignoreMap":1035},[1040,3025,3026,3028,3031],{"class":1042,"line":1043},[1040,3027,1220],{"class":1073},[1040,3029,3030],{"class":1069}," setupPicker",[1040,3032,1226],{"class":1046},[1040,3034,3035,3038,3041,3043,3045,3047,3049],{"class":1042,"line":1057},[1040,3036,3037],{"class":1073},"  var",[1040,3039,3040],{"class":1046}," picker ",[1040,3042,1074],{"class":1073},[1040,3044,1986],{"class":1073},[1040,3046,1989],{"class":1046},[1040,3048,1992],{"class":1069},[1040,3050,1995],{"class":1046},[1040,3052,3053,3055,3057],{"class":1042,"line":1066},[1040,3054,2001],{"class":1046},[1040,3056,2004],{"class":1069},[1040,3058,2007],{"class":1046},[1040,3060,3061,3063,3065],{"class":1042,"line":1081},[1040,3062,2001],{"class":1046},[1040,3064,2015],{"class":1069},[1040,3066,2018],{"class":1046},[1040,3068,3069,3071,3073,3075,3077,3079,3081],{"class":1042,"line":1092},[1040,3070,2001],{"class":1046},[1040,3072,2249],{"class":1069},[1040,3074,1149],{"class":1046},[1040,3076,2254],{"class":1073},[1040,3078,1989],{"class":1046},[1040,3080,2259],{"class":1069},[1040,3082,2262],{"class":1046},[1040,3084,3085,3087,3090,3093,3096],{"class":1042,"line":1103},[1040,3086,2001],{"class":1046},[1040,3088,3089],{"class":1069},"enableFeature",[1040,3091,3092],{"class":1046},"(google.picker.Feature.",[1040,3094,3095],{"class":2042},"NAV_HIDDEN",[1040,3097,3098],{"class":1046},")\n",[1040,3100,3101,3103,3105],{"class":1042,"line":1184},[1040,3102,2001],{"class":1046},[1040,3104,2798],{"class":1069},[1040,3106,2801],{"class":1046},[1040,3108,3109,3111,3113],{"class":1042,"line":1325},[1040,3110,2001],{"class":1046},[1040,3112,2026],{"class":1069},[1040,3114,1404],{"class":1046},[1040,3116,3117,3120,3122,3124,3126],{"class":1042,"line":1331},[1040,3118,3119],{"class":1046},"  picker.",[1040,3121,2037],{"class":1069},[1040,3123,1149],{"class":1046},[1040,3125,2043],{"class":2042},[1040,3127,1155],{"class":1046},[1040,3129,3130],{"class":1042,"line":1603},[1040,3131,1257],{"class":1046},[929,3133,3134],{},"Final source code:",[1030,3136,3138],{"className":1032,"code":3137,"language":1034,"meta":1035,"style":1035},"\u003Cscript>\n  var clientId = '720409271749-hqv3lb4u0q82t68vperem5oi3kosskol.apps.googleusercontent.com';\n  var developerKey = 'AIzaSyBTEWsJ4aXdoOzB4ey81eX9-ja7HejL4Qc';\n  var accessToken;\n  function onApiLoad() {\n    gapi.load('auth', authenticateWithGoogle);\n    gapi.load('picker');\n  }\n  function authenticateWithGoogle() {\n    window.gapi.auth.authorize({\n      'client_id': clientId,\n      'scope': ['https:\u002F\u002Fwww.googleapis.com\u002Fauth\u002Fdrive']\n    }, handleAuthentication);\n  }\n  function handleAuthentication(result) {\n    if(result && !result.error) {\n      accessToken = result.access_token;\n      setupPicker();\n    }\n  }\n  function setupPicker() {\n    var picker = new google.picker.PickerBuilder()\n      .setOAuthToken(accessToken)\n      .setDeveloperKey(developerKey)\n      .addView(new google.picker.DocsUploadView())\n      .enableFeature(google.picker.Feature.NAV_HIDDEN)\n      .setCallback(myCallback)\n      .build();\n    picker.setVisible(true);\n  }\n  function myCallback(data) {\n    if (data.action == google.picker.Action.PICKED) {\n      alert(data.docs[0].name);\n    } else if (data.action == google.picker.Action.CANCEL) {\n      alert('goodbye');\n    }\n  }\n\u003C\u002Fscript>\n\u003Cscript src=\"https:\u002F\u002Fapis.google.com\u002Fjs\u002Fapi.js?onload=onApiLoad\">\u003C\u002Fscript>\n",[1037,3139,3140,3148,3152,3156,3160,3164,3176,3188,3192,3196,3204,3210,3220,3224,3228,3232,3244,3252,3258,3262,3266,3270,3284,3292,3300,3316,3328,3336,3344,3356,3360,3364,3378,3389,3407,3417,3422,3427,3436],{"__ignoreMap":1035},[1040,3141,3142,3144,3146],{"class":1042,"line":1043},[1040,3143,1047],{"class":1046},[1040,3145,1098],{"class":1050},[1040,3147,1054],{"class":1046},[1040,3149,3150],{"class":1042,"line":1057},[1040,3151,1545],{"class":1046},[1040,3153,3154],{"class":1042,"line":1066},[1040,3155,1853],{"class":1046},[1040,3157,3158],{"class":1042,"line":1081},[1040,3159,1686],{"class":1046},[1040,3161,3162],{"class":1042,"line":1092},[1040,3163,1138],{"class":1046},[1040,3165,3166,3168,3170,3172,3174],{"class":1042,"line":1103},[1040,3167,1143],{"class":1046},[1040,3169,1146],{"class":1069},[1040,3171,1149],{"class":1046},[1040,3173,1152],{"class":1077},[1040,3175,1562],{"class":1046},[1040,3177,3178,3180,3182,3184,3186],{"class":1042,"line":1184},[1040,3179,1143],{"class":1046},[1040,3181,1146],{"class":1069},[1040,3183,1149],{"class":1046},[1040,3185,1166],{"class":1077},[1040,3187,1155],{"class":1046},[1040,3189,3190],{"class":1042,"line":1325},[1040,3191,1173],{"class":1046},[1040,3193,3194],{"class":1042,"line":1331},[1040,3195,1479],{"class":1046},[1040,3197,3198,3200,3202],{"class":1042,"line":1603},[1040,3199,1587],{"class":1046},[1040,3201,1282],{"class":1069},[1040,3203,1592],{"class":1046},[1040,3205,3206,3208],{"class":1042,"line":1617},[1040,3207,1597],{"class":1077},[1040,3209,1600],{"class":1046},[1040,3211,3212,3214,3216,3218],{"class":1042,"line":1623},[1040,3213,1606],{"class":1077},[1040,3215,1609],{"class":1046},[1040,3217,1309],{"class":1077},[1040,3219,1614],{"class":1046},[1040,3221,3222],{"class":1042,"line":1628},[1040,3223,1922],{"class":1046},[1040,3225,3226],{"class":1042,"line":1637},[1040,3227,1173],{"class":1046},[1040,3229,3230],{"class":1042,"line":1764},[1040,3231,1931],{"class":1046},[1040,3233,3234,3236,3238,3240,3242],{"class":1042,"line":1778},[1040,3235,1767],{"class":1069},[1040,3237,1938],{"class":1046},[1040,3239,1380],{"class":1073},[1040,3241,1383],{"class":1073},[1040,3243,1945],{"class":1046},[1040,3245,3246,3248,3250],{"class":1042,"line":1788},[1040,3247,1781],{"class":1046},[1040,3249,1074],{"class":1073},[1040,3251,1954],{"class":1046},[1040,3253,3254,3256],{"class":1042,"line":1794},[1040,3255,1959],{"class":1069},[1040,3257,1404],{"class":1046},[1040,3259,3260],{"class":1042,"line":1799},[1040,3261,1791],{"class":1046},[1040,3263,3264],{"class":1042,"line":1808},[1040,3265,1173],{"class":1046},[1040,3267,3268],{"class":1042,"line":1972},[1040,3269,1975],{"class":1046},[1040,3271,3272,3274,3276,3278,3280,3282],{"class":1042,"line":1978},[1040,3273,1981],{"class":1046},[1040,3275,1074],{"class":1073},[1040,3277,1986],{"class":1073},[1040,3279,1989],{"class":1046},[1040,3281,1992],{"class":1069},[1040,3283,1995],{"class":1046},[1040,3285,3286,3288,3290],{"class":1042,"line":1998},[1040,3287,2246],{"class":1046},[1040,3289,2004],{"class":1069},[1040,3291,2007],{"class":1046},[1040,3293,3294,3296,3298],{"class":1042,"line":2010},[1040,3295,2246],{"class":1046},[1040,3297,2015],{"class":1069},[1040,3299,2018],{"class":1046},[1040,3301,3302,3304,3306,3308,3310,3312,3314],{"class":1042,"line":2021},[1040,3303,2246],{"class":1046},[1040,3305,2249],{"class":1069},[1040,3307,1149],{"class":1046},[1040,3309,2254],{"class":1073},[1040,3311,1989],{"class":1046},[1040,3313,2259],{"class":1069},[1040,3315,2262],{"class":1046},[1040,3317,3318,3320,3322,3324,3326],{"class":1042,"line":2031},[1040,3319,2246],{"class":1046},[1040,3321,3089],{"class":1069},[1040,3323,3092],{"class":1046},[1040,3325,3095],{"class":2042},[1040,3327,3098],{"class":1046},[1040,3329,3330,3332,3334],{"class":1042,"line":2048},[1040,3331,2246],{"class":1046},[1040,3333,2798],{"class":1069},[1040,3335,2801],{"class":1046},[1040,3337,3338,3340,3342],{"class":1042,"line":2053},[1040,3339,2246],{"class":1046},[1040,3341,2026],{"class":1069},[1040,3343,1404],{"class":1046},[1040,3345,3346,3348,3350,3352,3354],{"class":1042,"line":2062},[1040,3347,2034],{"class":1046},[1040,3349,2037],{"class":1069},[1040,3351,1149],{"class":1046},[1040,3353,2043],{"class":2042},[1040,3355,1155],{"class":1046},[1040,3357,3358],{"class":1042,"line":2313},[1040,3359,1173],{"class":1046},[1040,3361,3362],{"class":1042,"line":2568},[1040,3363,2830],{"class":1046},[1040,3365,3366,3368,3370,3372,3374,3376],{"class":1042,"line":2833},[1040,3367,1767],{"class":1069},[1040,3369,2942],{"class":1046},[1040,3371,2945],{"class":1073},[1040,3373,2948],{"class":1046},[1040,3375,2951],{"class":2042},[1040,3377,1369],{"class":1046},[1040,3379,3380,3383,3385,3387],{"class":1042,"line":2840},[1040,3381,3382],{"class":1069},"      alert",[1040,3384,2961],{"class":1046},[1040,3386,2964],{"class":2042},[1040,3388,2967],{"class":1046},[1040,3390,3391,3394,3397,3399,3401,3403,3405],{"class":1042,"line":2845},[1040,3392,3393],{"class":1046},"    } else ",[1040,3395,3396],{"class":1069},"if",[1040,3398,2942],{"class":1046},[1040,3400,2945],{"class":1073},[1040,3402,2948],{"class":1046},[1040,3404,2987],{"class":2042},[1040,3406,1369],{"class":1046},[1040,3408,3409,3411,3413,3415],{"class":1042,"line":2854},[1040,3410,3382],{"class":1069},[1040,3412,1149],{"class":1046},[1040,3414,2998],{"class":1077},[1040,3416,1155],{"class":1046},[1040,3418,3420],{"class":1042,"line":3419},36,[1040,3421,1791],{"class":1046},[1040,3423,3425],{"class":1042,"line":3424},37,[1040,3426,1173],{"class":1046},[1040,3428,3430,3432,3434],{"class":1042,"line":3429},38,[1040,3431,1106],{"class":1046},[1040,3433,1098],{"class":1050},[1040,3435,1054],{"class":1046},[1040,3437,3439,3441,3443,3445,3447,3449,3451,3453],{"class":1042,"line":3438},39,[1040,3440,1047],{"class":1046},[1040,3442,1098],{"class":1050},[1040,3444,1191],{"class":1069},[1040,3446,1074],{"class":1073},[1040,3448,1196],{"class":1077},[1040,3450,1199],{"class":1046},[1040,3452,1098],{"class":1050},[1040,3454,1054],{"class":1046},[3456,3457,3458],"style",{},"html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":1035,"searchDepth":1057,"depth":1057,"links":3460},[3461,3462,3463,3464,3465,3466,3467,3468,3469,3470,3471,3472,3473,3474,3475,3476,3477,3478,3479,3480],{"id":926,"depth":1057,"text":927},{"id":958,"depth":1057,"text":959},{"id":993,"depth":1057,"text":994},{"id":1000,"depth":1057,"text":1001},{"id":1007,"depth":1057,"text":1008},{"id":1014,"depth":1057,"text":1015},{"id":1024,"depth":1057,"text":1025},{"id":1116,"depth":1057,"text":1117},{"id":1206,"depth":1057,"text":1207},{"id":1336,"depth":1057,"text":1337},{"id":1418,"depth":1057,"text":1419},{"id":1512,"depth":1057,"text":1513},{"id":1656,"depth":1057,"text":1657},{"id":1827,"depth":1057,"text":1828},{"id":2081,"depth":1057,"text":2082},{"id":2587,"depth":1057,"text":2588},{"id":2873,"depth":1057,"text":2588},{"id":2884,"depth":1057,"text":2885},{"id":2909,"depth":1057,"text":2910},{"id":3011,"depth":1057,"text":3012},"2014-09-04","md","\u002Fimages\u002Fblog\u002Ffeatures\u002Fgoogle-picker-with-drive.jpg",{},{"title":341,"description":343},"blog\u002Fgoogle-picker-with-drive",[16,17],"kFmcsFc_B60vDOcuwRBwXeSH7vEXgA5_JLFtYM26Ris",[3490,3492],{"title":538,"path":539,"stem":3491,"children":-1},"blog\u002Fjquery-introduction",{"title":169,"path":170,"stem":3493,"children":-1},"blog\u002Fember-handlebars",1784954528245]