├── .gitignore ├── js └── pernilongo.js │ ├── helpers │ ├── current_layer.js │ ├── epilogue_callback.js │ ├── loading_helper.js │ ├── message_helper.js │ └── http_helper.js │ ├── conf.js │ ├── plugins │ ├── bind_forms.js │ └── handlebars_helpers.js │ ├── README.md │ ├── storage │ ├── default_persistence.js │ └── local_storage_persistence.js │ ├── views │ ├── stories │ │ ├── index.html │ │ └── show.html │ └── home │ │ ├── index.html │ │ ├── about.html │ │ └── submit_story.html │ ├── initializers │ └── ie-workaround.js │ ├── main.js │ ├── controllers │ ├── home_controller.js │ └── stories_controller.js │ ├── routes.js │ └── vendor │ ├── loki-indexed-adapter.min.js │ ├── select2.min.css │ ├── lokijs.min.js │ └── select2.full.min.js ├── css ├── ie10-viewport-bug-workaround.css └── justified-nav.css ├── README.md ├── LICENSE ├── index.html └── data.json /.gitignore: -------------------------------------------------------------------------------- 1 | .env 2 | s3_website.yml -------------------------------------------------------------------------------- /js/pernilongo.js/helpers/current_layer.js: -------------------------------------------------------------------------------- 1 | var currentLayer = function(){ 2 | var layer = $(conf['deployTarget']); 3 | 4 | return layer; 5 | } -------------------------------------------------------------------------------- /js/pernilongo.js/conf.js: -------------------------------------------------------------------------------- 1 | var conf = { 2 | 'deployTarget' : '#content', 3 | 'viewUrl' : '/js/pernilongo.js/views/', 4 | 'apiUrl' : '/' 5 | } 6 | -------------------------------------------------------------------------------- /js/pernilongo.js/plugins/bind_forms.js: -------------------------------------------------------------------------------- 1 | $(document).on("submit", "#content", function(e){ 2 | e.preventDefault(); 3 | var form = $(e.target); 4 | 5 | render(form.attr("action"), { 6 | 'method' : form.attr("method"), 7 | 'formData' : form.serialize() 8 | }); 9 | 10 | return false; 11 | }); -------------------------------------------------------------------------------- /js/pernilongo.js/README.md: -------------------------------------------------------------------------------- 1 | # Pernilongo.js 2 | ## JS Framework for SPA 3 | 4 | - Requires JQuery 5 | - Similar to Ruby on Rails directory structure 6 | - Uses Handlebars.js for templates 7 | 8 | Inspiration: [Making a Single Page App Without a Framework](http://tutorialzine.com/2015/02/single-page-app-without-a-framework/) -------------------------------------------------------------------------------- /js/pernilongo.js/storage/default_persistence.js: -------------------------------------------------------------------------------- 1 | var defaultPersistence = function(){} 2 | 3 | defaultPersistence.store = function(key, value, isJson){ 4 | return localStoragePersistence.store(key, value, isJson); 5 | } 6 | 7 | defaultPersistence.restore = function(key){ 8 | return localStoragePersistence.restore(key); 9 | } 10 | 11 | defaultPersistence.delete = function(key){ 12 | return localStoragePersistence.delete(key); 13 | } -------------------------------------------------------------------------------- /css/ie10-viewport-bug-workaround.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * IE10 viewport hack for Surface/desktop Windows 8 bug 3 | * Copyright 2014-2015 Twitter, Inc. 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | */ 6 | 7 | /* 8 | * See the Getting Started docs for more information: 9 | * http://getbootstrap.com/getting-started/#support-ie10-width 10 | */ 11 | @-webkit-viewport { width: device-width; } 12 | @-moz-viewport { width: device-width; } 13 | @-ms-viewport { width: device-width; } 14 | @-o-viewport { width: device-width; } 15 | @viewport { width: device-width; } -------------------------------------------------------------------------------- /js/pernilongo.js/views/stories/index.html: -------------------------------------------------------------------------------- 1 |
2 |

Stories

3 |
4 | {{#if no_results}} 5 |

Your query for {{query}} returned no results.

6 | {{/if}} 7 | 8 | {{#each story_chunks}} 9 |
10 | {{#each .}} 11 |
12 |

{{title}}

13 |

{{description}}

14 |

View details »

15 |
16 | {{/each}} 17 |
18 | {{/each}} 19 |
-------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ### Some technical information 2 | 3 | - All stories are stored in data.json 4 | - The web application does all the filtering / presentation 5 | - The web applications uses a very simple javascript framework (pernilongo.js) 6 | - All files are static, so to install, run them under Nginx / Apache for example 7 | 8 | ### Contributing 9 | 10 | - Story submissions are more than welcome. Check out the [instructions](http://howihacked.info/#/submit) 11 | 12 | ### About the author 13 | 14 | - Anderson Dadario ([@andersonmvd](https://twitter.com/andersonmvd)) 15 | - More info at [http://dadario.com.br](http://dadario.com.br) -------------------------------------------------------------------------------- /js/pernilongo.js/initializers/ie-workaround.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * IE10 viewport hack for Surface/desktop Windows 8 bug 3 | * Copyright 2014-2015 Twitter, Inc. 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | */ 6 | 7 | // See the Getting Started docs for more information: 8 | // http://getbootstrap.com/getting-started/#support-ie10-width 9 | 10 | (function () { 11 | 'use strict'; 12 | 13 | if (navigator.userAgent.match(/IEMobile\/10\.0/)) { 14 | var msViewportStyle = document.createElement('style') 15 | msViewportStyle.appendChild( 16 | document.createTextNode( 17 | '@-ms-viewport{width:auto!important}' 18 | ) 19 | ) 20 | document.querySelector('head').appendChild(msViewportStyle) 21 | } 22 | 23 | })(); -------------------------------------------------------------------------------- /js/pernilongo.js/helpers/epilogue_callback.js: -------------------------------------------------------------------------------- 1 | var epilogue = { 2 | 'success_messages' : [], 3 | 'error_messages' : [] 4 | } 5 | 6 | var epilogueCallback = function(isApi){ 7 | if(!isApi){ 8 | // Messages 9 | if(epilogue['success_messages'].length > 0){ 10 | $.each(epilogue['success_messages'], function(index, message){ 11 | MessageHelper.SuccessMessage.create(message); 12 | }) 13 | epilogue['success_messages'] = []; 14 | } 15 | 16 | if(epilogue['error_messages'].length > 0){ 17 | $.each(epilogue['error_messages'], function(index, message){ 18 | MessageHelper.ErrorMessage.create(message); 19 | }) 20 | epilogue['error_messages'] = []; 21 | } 22 | } 23 | } -------------------------------------------------------------------------------- /js/pernilongo.js/helpers/loading_helper.js: -------------------------------------------------------------------------------- 1 | var LoadingHelper = function(){ } 2 | 3 | LoadingHelper.doesLoadingExist = function(label){ 4 | return ($(".loading[data-label='"+label+"']").length > 0); 5 | } 6 | 7 | LoadingHelper.create = function(label){ 8 | var display = ''; 9 | if($(".loading").length > 0) display = 'display:none'; 10 | 11 | var loading = '
'; 12 | loading += 'Loading...'; 13 | loading += '
'; 14 | 15 | currentLayer().prepend(loading); 16 | } 17 | 18 | LoadingHelper.remove = function(label){ 19 | var loading_selector = ".loading[data-label='"+label+"']"; 20 | var fadeOutSpeed = "fast"; 21 | if($(".loading").length > 1) fadeOutSpeed = 0; 22 | 23 | $(loading_selector).fadeOut(fadeOutSpeed, function(){ 24 | $(this).remove(); 25 | $(".loading:hidden:first").show(); 26 | }); 27 | } -------------------------------------------------------------------------------- /js/pernilongo.js/views/home/index.html: -------------------------------------------------------------------------------- 1 | 2 |
3 |

How I Hacked

4 |

Open source database of hacking stories for educational purposes

5 |
6 | 8 |

9 |
10 | or submit a story 11 |
12 |
13 | 14 | 15 |
16 |
17 |

Latest Stories

18 |
19 |
20 |
21 | {{#each story}} 22 |
23 |

{{title}}

24 |

{{description}}

25 |

View details »

26 |
27 | {{/each}} 28 |
29 |
-------------------------------------------------------------------------------- /js/pernilongo.js/plugins/handlebars_helpers.js: -------------------------------------------------------------------------------- 1 | Handlebars.registerHelper('ifCond', function (v1, operator, v2, options) { 2 | switch (operator) { 3 | case '==': 4 | return (v1 == v2) ? options.fn(this) : options.inverse(this); 5 | case '===': 6 | return (v1 === v2) ? options.fn(this) : options.inverse(this); 7 | case '<': 8 | return (v1 < v2) ? options.fn(this) : options.inverse(this); 9 | case '<=': 10 | return (v1 <= v2) ? options.fn(this) : options.inverse(this); 11 | case '>': 12 | return (v1 > v2) ? options.fn(this) : options.inverse(this); 13 | case '>=': 14 | return (v1 >= v2) ? options.fn(this) : options.inverse(this); 15 | case '&&': 16 | return (v1 && v2) ? options.fn(this) : options.inverse(this); 17 | case '||': 18 | return (v1 || v2) ? options.fn(this) : options.inverse(this); 19 | default: 20 | return options.inverse(this); 21 | } 22 | }); -------------------------------------------------------------------------------- /js/pernilongo.js/main.js: -------------------------------------------------------------------------------- 1 | $(document).ready(function(){ 2 | // Start DB 3 | db = new loki('loki.json'); 4 | Story = db.addCollection('story'); 5 | choices = []; // Store autocomplete values for search 6 | 7 | HttpHelper.loadPage({ 8 | 'apiUrl' : 'data.json', 9 | 'complete' : function(jqXHR, textStatus){ 10 | var content = jqXHR.responseJSON; 11 | 12 | for(var i=0;i 2 |

About

3 |
4 |
5 |
6 |

Hello there!

7 |

This website was made by Anderson Dadario (@andersonmvd) and is intended to be mainteined by him and by the security community through stories submissions. Both the data and the source code are open source and available on GitHub in the repository andersonDadario/howihacked. You're more than welcome to contribute!

8 | 9 |

This site at first was supposed to be a blog post, but Anderson thought that could be done better so he built this website in one day (2015-12-12) to provide a better experience for those who want to learn about hacking cases to enhance their skills on protecting applications and servers from real world threats.

10 |
11 |
12 | 13 |
14 |
15 | -------------------------------------------------------------------------------- /js/pernilongo.js/views/home/submit_story.html: -------------------------------------------------------------------------------- 1 |
2 |

Submit a Story

3 |
4 |
5 |
6 |

Option 1) GitHub Issue

7 |
    8 |
  • Just open an issue.
  • 9 |
  • We will review and add it and modify only if necessary.
  • 10 |
  • Your name will appear as the story submitter.
  • 11 |
  • We appreciate your interest to help in advance. Thank you.
  • 12 |
13 |
14 |
15 |

Option 2) Pull Request

16 |
    17 |
  • Feel free to directly update the 'data.json' file adding your story on the top of it. Please add all attributes as shown in other stories.
  • 18 |
  • Slugs can have only alphanumeric and dashes.
  • 19 |
  • Tags can have only alphanumeric characters.
  • 20 |
  • We will review and add it and modify only if necessary.
  • 21 |
  • Your name will appear as the story submitter.
  • 22 |
  • We appreciate your interest to help in advance. Thank you.
  • 23 |
24 |
25 |
26 |
-------------------------------------------------------------------------------- /js/pernilongo.js/storage/local_storage_persistence.js: -------------------------------------------------------------------------------- 1 | var localStoragePersistence = function(){} 2 | 3 | localStoragePersistence.store = function(key, value, isJson){ 4 | if(!isJson) var value = JSON.stringify(value, function (key, value) { 5 | if (typeof value === 'function') { 6 | return value.toString(); 7 | } 8 | 9 | return value; 10 | }); 11 | localStorage.setItem(key, value); 12 | return true; 13 | } 14 | 15 | localStoragePersistence.restore = function(key){ 16 | var item = localStorage.getItem(key); 17 | if(!item) return null; 18 | return JSON.parse(item, function (key, value) { 19 | if (value 20 | && typeof value === "string" 21 | && value.substr(0,8) == "function") 22 | { 23 | var startBody = value.indexOf('{') + 1; 24 | var endBody = value.lastIndexOf('}'); 25 | var startArgs = value.indexOf('(') + 1; 26 | var endArgs = value.indexOf(')'); 27 | 28 | return new Function(value.substring(startArgs, endArgs) 29 | , value.substring(startBody, endBody)); 30 | } 31 | return value; 32 | }); 33 | } 34 | 35 | localStoragePersistence.delete = function(key){ 36 | localStorage.removeItem(key); 37 | return true; 38 | } -------------------------------------------------------------------------------- /js/pernilongo.js/controllers/home_controller.js: -------------------------------------------------------------------------------- 1 | var HomeController = function(){} 2 | 3 | HomeController.index = function(params){ 4 | var stories = Story.find().slice(0,3); 5 | 6 | // Load latest stories 7 | HttpHelper.loadPage({ 8 | 'viewUrl' : 'home/index.html', 9 | 'context' : { 10 | 'story': stories 11 | }, 12 | 'complete' : function(jqXHR, textStatus){ 13 | $(".nav").find("li").removeClass("active"); 14 | $("#nav_home").addClass("active"); 15 | 16 | // Set Autocomplete for Search field 17 | $(".select2").select2({ 18 | placeholder: "Type a story tag (e.g., XSS or SSRF)", 19 | width: '100%', 20 | data: choices 21 | }); 22 | } 23 | }); 24 | } 25 | 26 | HomeController.about = function(params){ 27 | HttpHelper.loadPage({ 28 | 'viewUrl' : 'home/about.html', 29 | 'complete' : function(jqXHR, textStatus){ 30 | $(".nav").find("li").removeClass("active"); 31 | $("#nav_about").addClass("active"); 32 | } 33 | }); 34 | } 35 | 36 | HomeController.submitSearch = function(params){ 37 | var query = decodeURIComponent(params['data']['formData']); 38 | query = query.replace("search=",""); 39 | query = query.replace("&search=",","); 40 | 41 | if(query == ""){ 42 | redirectTo("#/stories"); 43 | } else { 44 | redirectTo("#/stories/tags/" + query); 45 | } 46 | } 47 | 48 | HomeController.submitStory = function(params){ 49 | HttpHelper.loadPage({ 50 | 'viewUrl' : 'home/submit_story.html' 51 | }); 52 | } -------------------------------------------------------------------------------- /js/pernilongo.js/controllers/stories_controller.js: -------------------------------------------------------------------------------- 1 | var StoriesController = function(){} 2 | 3 | function getChunksFrom(stories){ 4 | var stories_in_chunks = []; 5 | var i,j,temparray,chunk = 3; 6 | for (i=0,j=stories.length; i'; 7 | msg += ''; 8 | msg += ' '; 9 | msg = $(msg); 10 | msg.find(".basemessage").text(text); 11 | 12 | return msg; 13 | } 14 | 15 | MessageHelper.InfoMessage = { 16 | create: function(text){ 17 | var msg = MessageHelper.BaseMessage(text); 18 | msg.addClass("alert-info"); 19 | msg.find("i:first").addClass("fa-info-circle"); 20 | msg.find("strong:first").html("Info!"); 21 | currentLayer().prepend(msg); 22 | } 23 | } 24 | 25 | MessageHelper.SuccessMessage = { 26 | create: function(text){ 27 | var msg = MessageHelper.BaseMessage(text); 28 | msg.addClass("alert-success"); 29 | msg.find("i:first").addClass("fa-check"); 30 | msg.find("strong:first").html("Success!"); 31 | currentLayer().prepend(msg); 32 | } 33 | } 34 | 35 | MessageHelper.ErrorMessage = { 36 | create: function(text){ 37 | var msg = MessageHelper.BaseMessage(text); 38 | msg.addClass("alert-danger"); 39 | msg.find("i:first").addClass("fa-times-circle"); 40 | msg.find("strong:first").html("Error!"); 41 | currentLayer().prepend(msg); 42 | } 43 | } 44 | 45 | // Form 46 | MessageHelper.FormErrorMessage = { 47 | create: function(responseJSON){ 48 | var text = '

Errors prohibited this form from being submitted:

' 49 | text = text + ''; 57 | 58 | var msg = MessageHelper.BaseMessage(text, 'margin: 5% 5% 0 5%'); 59 | msg.addClass("alert-danger"); 60 | msg.find("i:first, strong:first").remove(); 61 | currentLayer().prepend(msg); 62 | } 63 | } -------------------------------------------------------------------------------- /js/pernilongo.js/routes.js: -------------------------------------------------------------------------------- 1 | var Routes = function(options){ 2 | var root = this; 3 | var vars = { 'path': '', 'data': '' }; 4 | $.extend(vars, options); 5 | 6 | var routes = { 7 | '^#/submit$' : function(params) { 8 | HomeController.submitStory(params); 9 | }, 10 | '^#/submitSearch$' : function(params) { 11 | HomeController.submitSearch(params); 12 | }, 13 | '^#/about$' : function(params) { 14 | HomeController.about(params); 15 | }, 16 | '^#/stories$' : function(params) { 17 | StoriesController.index(params); 18 | }, 19 | '^#/stories/([a-zA-Z0-9-_]+)$' : function(params) { 20 | StoriesController.show(params); 21 | }, 22 | '^#/stories/tags/([a-zA-Z0-9-,_]+)$' : function(params) { 23 | StoriesController.query(params); 24 | }, 25 | '^$' : function(params) { 26 | // Default Route 27 | HomeController.index(params); 28 | } 29 | } 30 | 31 | this.render = function(path){ 32 | if(!path){ var path = vars['path']; } 33 | var match = false; 34 | 35 | $.each(routes, function(key, value){ 36 | var pattern = new RegExp(key); 37 | if(path.search(pattern) == 0){ 38 | var matches = pattern.exec(path); 39 | value({ 40 | 'regex' : matches, 41 | 'data' : vars['data'] 42 | }); 43 | match = true; 44 | return false; 45 | } 46 | }); 47 | 48 | return match; 49 | } 50 | } 51 | 52 | // Forward 53 | var forwardTo = function(hash, data){ 54 | render(hash, data); 55 | } 56 | 57 | // Redirect 58 | var redirectTo = function(hash, data){ 59 | window.location.hash = hash; 60 | } 61 | 62 | // Render page after hash 63 | var render = function (uri, data) { 64 | var routes = new Routes({ 65 | 'path' : uri, 66 | 'data' : data 67 | }); 68 | if(!routes.render()){ 69 | var error_message = "Page not found."; 70 | MessageHelper.ErrorMessage.create(error_message); 71 | } 72 | } 73 | 74 | // Whenever the Hash Change, we render again 75 | $(window).on('hashchange', function(){ 76 | render(window.location.hash, null); 77 | }); -------------------------------------------------------------------------------- /css/justified-nav.css: -------------------------------------------------------------------------------- 1 | body { 2 | padding-top: 20px; 3 | } 4 | 5 | .footer { 6 | padding-top: 40px; 7 | padding-bottom: 40px; 8 | margin-top: 40px; 9 | border-top: 1px solid #eee; 10 | } 11 | 12 | /* Main marketing message and sign up button */ 13 | .jumbotron { 14 | text-align: center; 15 | background-color: transparent; 16 | } 17 | .jumbotron .btn { 18 | padding: 14px 24px; 19 | font-size: 21px; 20 | } 21 | 22 | /* Customize the nav-justified links to be fill the entire space of the .navbar */ 23 | 24 | .nav-justified { 25 | background-color: #eee; 26 | border: 1px solid #ccc; 27 | border-radius: 5px; 28 | } 29 | .nav-justified > li > a { 30 | padding-top: 15px; 31 | padding-bottom: 15px; 32 | margin-bottom: 0; 33 | font-weight: bold; 34 | color: #777; 35 | text-align: center; 36 | background-color: #e5e5e5; /* Old browsers */ 37 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e5e5e5)); 38 | background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e5e5e5 100%); 39 | background-image: -o-linear-gradient(top, #f5f5f5 0%, #e5e5e5 100%); 40 | background-image: linear-gradient(to bottom, #f5f5f5 0%,#e5e5e5 100%); 41 | filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#e5e5e5',GradientType=0 ); /* IE6-9 */ 42 | background-repeat: repeat-x; /* Repeat the gradient */ 43 | border-bottom: 1px solid #d5d5d5; 44 | } 45 | .nav-justified > .active > a, 46 | .nav-justified > .active > a:hover, 47 | .nav-justified > .active > a:focus { 48 | background-color: #ddd; 49 | background-image: none; 50 | -webkit-box-shadow: inset 0 3px 7px rgba(0,0,0,.15); 51 | box-shadow: inset 0 3px 7px rgba(0,0,0,.15); 52 | } 53 | .nav-justified > li:first-child > a { 54 | border-radius: 5px 5px 0 0; 55 | } 56 | .nav-justified > li:last-child > a { 57 | border-bottom: 0; 58 | border-radius: 0 0 5px 5px; 59 | } 60 | 61 | @media (min-width: 768px) { 62 | .nav-justified { 63 | max-height: 52px; 64 | } 65 | .nav-justified > li > a { 66 | border-right: 1px solid #d5d5d5; 67 | border-left: 1px solid #fff; 68 | } 69 | .nav-justified > li:first-child > a { 70 | border-left: 0; 71 | border-radius: 5px 0 0 5px; 72 | } 73 | .nav-justified > li:last-child > a { 74 | border-right: 0; 75 | border-radius: 0 5px 5px 0; 76 | } 77 | } 78 | 79 | /* Responsive: Portrait tablets and up */ 80 | @media screen and (min-width: 768px) { 81 | /* Remove the padding we set earlier */ 82 | .masthead, 83 | .marketing, 84 | .footer { 85 | padding-right: 0; 86 | padding-left: 0; 87 | } 88 | } -------------------------------------------------------------------------------- /js/pernilongo.js/helpers/http_helper.js: -------------------------------------------------------------------------------- 1 | var HttpHelper = function(){} 2 | 3 | HttpHelper.loadPage = function(extended_options){ 4 | var options = { 5 | 'url' : false, 6 | 'apiUrl' : false, 7 | 'viewUrl' : false, 8 | 'context' : false, 9 | 'method' : 'GET', 10 | 'headers' : {}, 11 | 'data' : '', 12 | 'replace_element' : conf['deployTarget'], 13 | 'statusCode' : {}, 14 | 'success' : function(data, textStatus, jqXHR){ 15 | if(options['context']){ 16 | var template = Handlebars.compile(data); 17 | var data = template(options['context']); 18 | } 19 | 20 | $(options['replace_element']).html(data); 21 | }, 22 | 'error' : function(jqXHR, textStatus, errorThrown){ 23 | if(jqXHR.status != "401"){ 24 | MessageHelper.ErrorMessage.create( 25 | "Error while loading " + path 26 | ); 27 | } 28 | }, 29 | 'errorEpilogue' : function(jqXHR, textStatus, errorThrown){ 30 | if(jqXHR.status == "401"){ 31 | defaultPersistence.store('after_login', extended_options); 32 | forwardTo('#/login'); 33 | } 34 | }, 35 | 'complete' : function(jqXHR, textStatus){}, 36 | 'skip_loading' : false, 37 | 'skip_remove_loading' : false 38 | } 39 | $.extend(options, extended_options) 40 | 41 | // Add CSRF Protection 42 | if($.inArray(options['method'].toUpperCase(), ['POST','PUT','DELETE']) != -1){ 43 | var nonce = Math.random().toString(); 44 | $.cookie('X-CSRF-Token', nonce); 45 | 46 | if(options['data'] == ''){ 47 | options['data'] = 'csrf_token=' + nonce; 48 | } else { 49 | options['data'] = options['data'] + '&csrf_token=' + nonce; 50 | } 51 | } 52 | 53 | // Patching URL 54 | if(options['url']) var path = options['url']; 55 | else if(options['apiUrl']) var path = conf['apiUrl'] + options['apiUrl']; 56 | else if(options['viewUrl']) var path = conf['viewUrl'] + options['viewUrl']; 57 | 58 | // Create Loading 59 | if(!options['skip_loading']){ 60 | LoadingHelper.create(path); 61 | } else if (LoadingHelper.doesLoadingExist(path)){ 62 | // Is request in progress? if yes, return 63 | return false; 64 | } 65 | 66 | // Ajax Request 67 | $.ajax({ 68 | method: options['method'].toUpperCase(), 69 | url: path, 70 | data: options['data'], 71 | headers: options['headers'], 72 | xhrFields: { 73 | withCredentials: true 74 | }, 75 | statusCode: options['statusCode'], 76 | success: options['success'], 77 | error: function(jqXHR, textStatus, errorThrown){ 78 | options['error'](jqXHR, textStatus, errorThrown); 79 | options['errorEpilogue'](jqXHR, textStatus, errorThrown); 80 | }, 81 | complete: function(jqXHR, textStatus){ 82 | if(!options['skip_remove_loading']){ 83 | LoadingHelper.remove(path); 84 | } 85 | 86 | options['complete'](jqXHR, textStatus); 87 | epilogueCallback(options['apiUrl']); 88 | } 89 | }); 90 | } 91 | 92 | HttpHelper.getParameterByName = function(name) { 93 | name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]"); 94 | var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"), 95 | results = regex.exec(location.search); 96 | return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " ")); 97 | } -------------------------------------------------------------------------------- /js/pernilongo.js/views/stories/show.html: -------------------------------------------------------------------------------- 1 | {{#with story}} 2 |
3 |

{{title}}

4 |
5 |
6 |

{{description}}

7 | 8 | 9 | 10 | 11 | 16 | 17 | 18 | 19 | 20 | 25 | 26 | 27 | 28 | 29 | 34 | 35 | 36 | 37 | 38 | 43 | 44 | 45 | 46 | 47 | 52 | 53 | 54 | 55 | 56 | 61 | 62 | 63 | 64 | 65 | 70 | 71 | 72 | 73 | 74 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 |
URLs: 12 | {{#each urls}} 13 | {{.}}
14 | {{/each}} 15 |
Hacked by: 21 | {{#each hacked_by}} 22 | {{.}}
23 | {{/each}} 24 |
Affected companies: 30 | {{#each companies}} 31 | {{.}}
32 | {{/each}} 33 |
Affected hosts: 39 | {{#each hosts}} 40 | {{.}}
41 | {{/each}} 42 |
Affected domains: 48 | {{#each domains}} 49 | {{.}}
50 | {{/each}} 51 |
Searchable tags: 57 | {{#each tags}} 58 | {{.}}
59 | {{/each}} 60 |
CVE IDs: 66 | {{#each cve_ids}} 67 | {{.}}
68 | {{/each}} 69 |
OSVDB IDs: 75 | {{#each osvdb_ids}} 76 | {{.}}
77 | {{/each}} 78 |
Hacked at: {{hacked_at}}
Reported at: {{reported_at}}
Fixed at: {{fixed_at}}
Rewarded at: {{rewarded_at}}
Reward Amount: {{reward_amount}} {{reward_currency}}
Database Entry Created by: {{created_by}}
Database Entry Updated by: {{#each updated_by}} 114 | {{.}}
115 | {{/each}}
Database Entry Created at: {{created_at}}
Database Entry Updated at: {{updated_at}}
URLs published at: {{published_at}}
Story permalink path: {{slug}}
138 |
139 |
140 | {{/with}} -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | How I Hacked 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 42 | 43 | 44 | 45 | 46 | 47 |
48 |
49 | Fork me on GitHub 50 |
51 |
52 | 53 |
54 | 55 |
56 |

How I Hacked.info

57 | 64 |
65 | 66 | 67 |
68 | 69 | 70 | 73 | 74 |
75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | -------------------------------------------------------------------------------- /js/pernilongo.js/vendor/loki-indexed-adapter.min.js: -------------------------------------------------------------------------------- 1 | (function(root,factory){if(typeof define==="function"&&define.amd){define([],factory)}else if(typeof exports==="object"){module.exports=factory()}else{root.LokiIndexedAdapter=factory()}})(this,function(){return function(){function IndexedAdapter(appname){this.app="loki";if(typeof appname!=="undefined"){this.app=appname}this.catalog=null;if(!this.checkAvailability()){throw new Error("indexedDB does not seem to be supported for your environment")}}IndexedAdapter.prototype.checkAvailability=function(){if(window&&window.indexedDB)return true;return false};IndexedAdapter.prototype.loadDatabase=function(dbname,callback){var appName=this.app;var adapter=this;if(this.catalog===null||this.catalog.db===null){this.catalog=new LokiCatalog(function(cat){adapter.catalog=cat;adapter.loadDatabase(dbname,callback)});return}this.catalog.getAppKey(appName,dbname,function(result){if(typeof callback==="function"){if(result.id===0){callback(null);return}callback(result.val)}else{console.log(result.val)}})};IndexedAdapter.prototype.loadKey=IndexedAdapter.prototype.loadDatabase;IndexedAdapter.prototype.saveDatabase=function(dbname,dbstring,callback){var appName=this.app;var adapter=this;function saveCallback(result){if(result&&result.success===true){callback(null)}else{callback(new Error("Error saving database"))}}if(this.catalog===null||this.catalog.db===null){this.catalog=new LokiCatalog(function(cat){adapter.catalog=cat;cat.setAppKey(appName,dbname,dbstring,saveCallback)});return}this.catalog.setAppKey(appName,dbname,dbstring,saveCallback)};IndexedAdapter.prototype.saveKey=IndexedAdapter.prototype.saveDatabase;IndexedAdapter.prototype.deleteDatabase=function(dbname){var appName=this.app;var adapter=this;if(this.catalog===null||this.catalog.db===null){this.catalog=new LokiCatalog(function(cat){adapter.catalog=cat;adapter.deleteDatabase(dbname)});return}this.catalog.getAppKey(appName,dbname,function(result){var id=result.id;if(id!==0){adapter.catalog.deleteAppKey(id)}})};IndexedAdapter.prototype.deleteKey=IndexedAdapter.prototype.deleteDatabase;IndexedAdapter.prototype.getDatabaseList=function(callback){var appName=this.app;var adapter=this;if(this.catalog===null||this.catalog.db===null){this.catalog=new LokiCatalog(function(cat){adapter.catalog=cat;adapter.getDatabaseList(callback)});return}this.catalog.getAppKeys(appName,function(results){var names=[];for(var idx=0;idx.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#5897fb;color:white}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top, #fff 50%, #eee 100%);background-image:-o-linear-gradient(top, #fff 50%, #eee 100%);background-image:linear-gradient(to bottom, #fff 50%, #eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top, #eee 50%, #ccc 100%);background-image:-o-linear-gradient(top, #eee 50%, #ccc 100%);background-image:linear-gradient(to bottom, #eee 50%, #ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0)}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:transparent;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top, #fff 0%, #eee 50%);background-image:-o-linear-gradient(top, #fff 0%, #eee 50%);background-image:linear-gradient(to bottom, #fff 0%, #eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top, #eee 50%, #fff 100%);background-image:-o-linear-gradient(top, #eee 50%, #fff 100%);background-image:linear-gradient(to bottom, #eee 50%, #fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{float:right}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb} 2 | -------------------------------------------------------------------------------- /data.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": [ 3 | 4 | { 5 | "slug" : "an-xss-on-facebook-via-pngs-and-wonky-content-types", 6 | "title": "An XSS on Facebook via PNGs & Wonky Content Types", 7 | "description": "@fin1te exploited a complex XSS on a CDN used by Facebook by abusing PNG files", 8 | "urls": ["https://fin1te.net/articles/xss-on-facebook-via-png-content-types/"], 9 | "companies": [ "Facebook" ], 10 | "hosts" : [], 11 | "domains" : [ "http://facebook.com/" ], 12 | "tags": [ "Facebook", "XSS", "PNG" ], 13 | "cve_ids": [], 14 | "osvdb_ids": [], 15 | "hacked_at": null, 16 | "reported_at": null, 17 | "fixed_at": null, 18 | "rewarded_at": null, 19 | "reward_amount": null, 20 | "reward_currency": null, 21 | "hacked_by": [ "@fin1te" ], 22 | "published_at": "2016-01-27", 23 | "created_at": "2016-01-28", 24 | "updated_at": "2016-01-28", 25 | "created_by": "@andersonmvd", 26 | "updated_by": [] 27 | } 28 | 29 | ,{ 30 | "slug" : "hacking-into-internet-connected-light-bulbs", 31 | "title": "Hacking into Internet Connected Light Bulbs", 32 | "description": "Alex Chapman reverse engineered LIFX light bulbs to discover the harcoded wifi credentials used in their internal Wifi component.", 33 | "urls": ["http://www.contextis.com/resources/blog/hacking-internet-connected-light-bulbs/"], 34 | "companies": [ "LIFX" ], 35 | "hosts" : [], 36 | "domains" : [ "http://lifx.co/" ], 37 | "tags": [ "LIFX", "ReverseEngineering" ], 38 | "cve_ids": [], 39 | "osvdb_ids": [], 40 | "hacked_at": null, 41 | "reported_at": null, 42 | "fixed_at": null, 43 | "rewarded_at": null, 44 | "reward_amount": null, 45 | "reward_currency": null, 46 | "hacked_by": [ "@CTXIS" ], 47 | "published_at": "2014-07-04", 48 | "created_at": "2015-12-28", 49 | "updated_at": "2015-12-28", 50 | "created_by": "@andersonmvd", 51 | "updated_by": [] 52 | } 53 | 54 | ,{ 55 | "slug" : "instagram-million-dollar-bug", 56 | "title": "Instagram's Million Dollar Bug", 57 | "description": "Wesley Wineberg found multiple vulnerabilities on Instagram, including RCE. The most interesting part is how (badly) Facebook reacted to his findings on his view. Alex Stamos (Facebook CSO) replied.", 58 | "urls": [ 59 | "http://www.exfiltrated.com/research-Instagram-RCE.php", 60 | "https://www.facebook.com/notes/alex-stamos/bug-bounty-ethics/10153799951452929", 61 | "https://news.ycombinator.com/item?id=10754194", 62 | "https://www.reddit.com/r/netsec/comments/3x8fsk/instagrams_million_dollar_bug_threats_lies_and/", 63 | "https://summitroute.com/blog/2015/12/24/instagram_bounty_case_study_for_defense/" 64 | ], 65 | "companies": [ "Instagram", "Facebook" ], 66 | "hosts": [], 67 | "domains" : ["sensu.instagram.com"], 68 | "tags": [ "Facebook", "Instagram", "RCE", "Ruby" ], 69 | "cve_ids": [], 70 | "osvdb_ids": [], 71 | "hacked_at": "2015-10-21", 72 | "reported_at": "2015-10-21", 73 | "fixed_at": null, 74 | "rewarded_at": "2015-11-16", 75 | "reward_amount": 2500, 76 | "reward_currency": "USD", 77 | "hacked_by": [ "Wesley Wineberg" ], 78 | "published_at": "2015-12-16", 79 | "created_at": "2015-12-17", 80 | "updated_at": "2015-12-17", 81 | "created_by": "@andersonmvd", 82 | "updated_by": [] 83 | } 84 | 85 | ,{ 86 | "slug" : "owncloud-6-0-0a-from-xss-to-shell", 87 | "title": "OwnCloud 6.0.0a: From XSS to Shell", 88 | "description": "James Sibley exploited a XSS that captured the CSRF token that led to a shell upload in the end.", 89 | "urls": [ 90 | "http://blog.noobroot.com/2014/02/owncloud-600a-when-xss-vulnerability.html", 91 | "https://www.exploit-db.com/exploits/31427/" 92 | ], 93 | "companies": [ "OwnCloud" ], 94 | "hosts": [], 95 | "domains" : [], 96 | "tags": [ "OwnCloud", "XSS", "CSRF", "RCE" ], 97 | "cve_ids": [ "CVE-2014-1665" ], 98 | "osvdb_ids": [ "102978" ], 99 | "hacked_at": null, 100 | "reported_at": null, 101 | "fixed_at": null, 102 | "rewarded_at": null, 103 | "reward_amount": null, 104 | "reward_currency": null, 105 | "hacked_by": [ "James Sibley" ], 106 | "published_at": "2014-02-05", 107 | "created_at": "2015-12-14", 108 | "updated_at": "2015-12-14", 109 | "created_by": "@andersonmvd", 110 | "updated_by": [] 111 | } 112 | 113 | ,{ 114 | "slug" : "multiple-vulnerabilities-on-pocket", 115 | "title": "Multiple Vulnerabilities on Pocket", 116 | "description": "Clint Ruoho exploited many vulnerabilities on Pocket that started with a Server Side Request Forgery (SSRF) to localhost. That led to one vulnerability after another. Pocket took 1 month to fix them all.", 117 | "urls": [ "https://www.gnu.gl/blog/Posts/multiple-vulnerabilities-in-pocket/" ], 118 | "companies": [ "Pocket" ], 119 | "hosts": [], 120 | "domains" : [ "pocket.com" ], 121 | "tags": [ "Pocket", "SSRF", "AmazonEC2", "ProtocolHandler" ], 122 | "cve_ids": [], 123 | "osvdb_ids": [], 124 | "hacked_at": null, 125 | "reported_at": "2015-07-25", 126 | "fixed_at": "2015-08-17", 127 | "rewarded_at": null, 128 | "reward_amount": null, 129 | "reward_currency": null, 130 | "hacked_by": [ "@ruoho" ], 131 | "published_at": "2015-08-18", 132 | "created_at": "2015-12-12", 133 | "updated_at": "2015-12-12", 134 | "created_by": "@andersonmvd", 135 | "updated_by": [] 136 | } 137 | 138 | ,{ 139 | "slug" : "neglected-dns-records-exploited-to-takeover-subdomains", 140 | "title": "Neglected DNS records exploited to takeover subdomains", 141 | "description": "Yassine found a CNAME (DNS entry) on Redbooth that pointed to a Heroku app. He leverage this fact to set a new app there and use the same name.", 142 | "urls": [ "http://yassineaboukir.com/blog/neglected-dns-records-exploited-to-takeover-subdomains/" ], 143 | "companies": [ "Redbooth" ], 144 | "hosts" : [], 145 | "domains" : [ "redbooth.com" ], 146 | "tags": [ "Redbooth", "SubdomainTakeover" ], 147 | "cve_ids": [], 148 | "osvdb_ids": [], 149 | "hacked_at": null, 150 | "reported_at": "2015-02-09", 151 | "fixed_at": "2015-02-11", 152 | "rewarded_at": null, 153 | "reward_amount": null, 154 | "reward_currency": null, 155 | "hacked_by": [ "@Yassineaboukir" ], 156 | "published_at": "2015-02-10", 157 | "created_at": "2015-12-12", 158 | "updated_at": "2015-12-12", 159 | "created_by": "@andersonmvd", 160 | "updated_by": [] 161 | } 162 | 163 | , { 164 | "slug" : "subdomain-takeover-on-users-tweetdeck-com", 165 | "title": "Subdomain Takeover on users.tweetdeck.com", 166 | "description": "@missoum1307 spotted a dangling DNS entry that allowed a TweetDeck subdomain takeover. Twitter fixed on the same day.", 167 | "urls": ["https://hackerone.com/reports/42236"], 168 | "companies": [ "Twitter" ], 169 | "hosts" : [], 170 | "domains" : [ "users.tweetdeck.com" ], 171 | "tags": [ "Twitter", "TweetDeck", "SubdomainTakeover", "AmazonS3" ], 172 | "cve_ids": [], 173 | "osvdb_ids": [], 174 | "hacked_at": null, 175 | "reported_at": "2014-12-31", 176 | "fixed_at": "2014-12-31", 177 | "rewarded_at": "2015-01-06", 178 | "reward_amount": 420, 179 | "reward_currency": "USD", 180 | "hacked_by": [ "@missoum1307" ], 181 | "published_at": "2014-12-31", 182 | "created_at": "2015-12-12", 183 | "updated_at": "2015-12-12", 184 | "created_by": "@andersonmvd", 185 | "updated_by": [] 186 | } 187 | 188 | , { 189 | "slug" : "subdomain-takeover-on-media-vine-co", 190 | "title": "Subdomain Takeover on media.vine.co", 191 | "description": "Frans Rosén spotted a dangling DNS entry that allowed a Vine subdomain takeover. Twitter fixed on the same day.", 192 | "urls": ["https://hackerone.com/reports/32825"], 193 | "companies": [ "Twitter" ], 194 | "hosts" : [], 195 | "domains" : [ "media.vine.co" ], 196 | "tags": [ "Twitter", "Vine", "SubdomainTakeover", "AmazonS3" ], 197 | "cve_ids": [], 198 | "osvdb_ids": [], 199 | "hacked_at": null, 200 | "reported_at": "2014-10-25", 201 | "fixed_at": "2014-10-27", 202 | "rewarded_at": "2014-11-03", 203 | "reward_amount": 1680, 204 | "reward_currency": "USD", 205 | "hacked_by": [ "@fransrosen" ], 206 | "published_at": "2014-11-03", 207 | "created_at": "2015-12-12", 208 | "updated_at": "2015-12-12", 209 | "created_by": "@andersonmvd", 210 | "updated_by": [] 211 | } 212 | 213 | , { 214 | "slug" : "hacking-paypal-accounts-with-one-click-patched", 215 | "title": "Hacking PayPal Accounts with one click (Patched)", 216 | "description": "Yasser ali exploited many vulnerabilities on PayPal starting with CSRF token reuse.", 217 | "urls": [ 218 | "http://yasserali.com/hacking-paypal-accounts-with-one-click/", 219 | "http://thehackernews.com/2014/12/hacking-paypal-account.html" 220 | ], 221 | "companies": [ "PayPal" ], 222 | "hosts" : [], 223 | "domains" : [ "paypal.com" ], 224 | "tags": [ "PayPal", "CSRF", "SecurityQuestions" ], 225 | "cve_ids": [], 226 | "osvdb_ids": [], 227 | "hacked_at": null, 228 | "reported_at": "2014-10-09", 229 | "fixed_at": null, 230 | "rewarded_at": null, 231 | "reward_amount": null, 232 | "reward_currency": null, 233 | "hacked_by": [ "@garagosy" ], 234 | "published_at": "2014-10-09", 235 | "created_at": "2015-12-12", 236 | "updated_at": "2015-12-12", 237 | "created_by": "@andersonmvd", 238 | "updated_by": [] 239 | } 240 | 241 | , { 242 | "slug" : "how-i-hacked-hotmail", 243 | "title": "How I Hacked Hotmail", 244 | "description": "Wesley Wineberg found a CSRF vulnerability in a critical authentication system used by Hotmail. He earned 24,000 USD for that.", 245 | "urls": [ 246 | "https://www.synack.com/2015/10/08/how-i-hacked-hotmail/" 247 | ], 248 | "companies": [ "Microsoft" ], 249 | "hosts" : [], 250 | "domains" : [ "login.live.com" ], 251 | "tags": [ "Microsoft", "Hotmail", "OAuth", "CSRF" ], 252 | "cve_ids": [], 253 | "osvdb_ids": [], 254 | "hacked_at": null, 255 | "reported_at": "2015-08-23", 256 | "fixed_at": "2015-09-15", 257 | "rewarded_at": "2015-09-15", 258 | "reward_amount": 24000, 259 | "reward_currency": "USD", 260 | "hacked_by": [ "@synack", "Wesley Wineberg" ], 261 | "published_at": "2014-10-09", 262 | "created_at": "2015-12-12", 263 | "updated_at": "2015-12-12", 264 | "created_by": "@andersonmvd", 265 | "updated_by": [] 266 | } 267 | 268 | , { 269 | "slug" : "how-patreon-got-hacked-publicly-exposed-werkzeug-debugger", 270 | "title": "How Patreon got hacked - Publicly exposed Werkzeug Debugger", 271 | "description": "Detectify warned Patreon before they got hacked. Patreon had a publicly exposed debugger that allowed attackers to issue arbitrary commands.", 272 | "urls": [ 273 | "http://labs.detectify.com/post/130332638391/how-patreon-got-hacked-publicly-exposed-werkzeug" 274 | ], 275 | "companies": [ "Patreon" ], 276 | "hosts" : [], 277 | "domains" : [ "patreon.com" ], 278 | "tags": [ "Patreon", "WerkzeugDebugger", "RCE" ], 279 | "cve_ids": [], 280 | "osvdb_ids": [], 281 | "hacked_at": null, 282 | "reported_at": "2015-09-28", 283 | "fixed_at": null, 284 | "rewarded_at": null, 285 | "reward_amount": null, 286 | "reward_currency": null, 287 | "hacked_by": [ "@detectify" ], 288 | "published_at": "2015-10-02", 289 | "created_at": "2015-12-12", 290 | "updated_at": "2015-12-12", 291 | "created_by": "@andersonmvd", 292 | "updated_by": [] 293 | } 294 | 295 | , { 296 | "slug" : "xss-to-rce-in-atlassian-hipchat", 297 | "title": "XSS to RCE in Atlassian Hipchat", 298 | "description": "Matt Austin found multiple vulnerabilities on Atlassian HipChat ranging from XSS, to Protocol Handling exploit and finally Remote Code Execution (RCE).", 299 | "urls": [ 300 | "http://maustin.net/2015/11/12/hipchat_rce.html" 301 | ], 302 | "companies": [ "Atlassian" ], 303 | "hosts" : [], 304 | "domains" : [ "hipchat.com" ], 305 | "tags": [ "Atlassian", "HipChat", "XSS", "RCE", "ProtocolHandler" ], 306 | "cve_ids": [], 307 | "osvdb_ids": [], 308 | "hacked_at": null, 309 | "reported_at": null, 310 | "fixed_at": null, 311 | "rewarded_at": null, 312 | "reward_amount": null, 313 | "reward_currency": null, 314 | "hacked_by": [ "@mattaustin" ], 315 | "published_at": "2015-11-15", 316 | "created_at": "2015-12-12", 317 | "updated_at": "2015-12-12", 318 | "created_by": "@andersonmvd", 319 | "updated_by": [] 320 | } 321 | 322 | , { 323 | "slug" : "hacking-starbucks-for-unlimited-coffee", 324 | "title": "Hacking Starbucks for unlimited coffee", 325 | "description": "Egor Homakov exploited a race condition vulnerability on Starbucks gift card processing system and got more credits than he would be able to.", 326 | "urls": [ 327 | "http://sakurity.com/blog/2015/05/21/starbucks.html" 328 | ], 329 | "companies": [ "Starbucks" ], 330 | "hosts" : [], 331 | "domains" : [ "starbucks.com" ], 332 | "tags": [ "Starbucks", "RaceCondition" ], 333 | "cve_ids": [], 334 | "osvdb_ids": [], 335 | "hacked_at": null, 336 | "reported_at": "2015-03-23", 337 | "fixed_at": null, 338 | "rewarded_at": null, 339 | "reward_amount": null, 340 | "reward_currency": null, 341 | "hacked_by": [ "@homakov" ], 342 | "published_at": "2015-05-21", 343 | "created_at": "2015-12-12", 344 | "updated_at": "2015-12-12", 345 | "created_by": "@andersonmvd", 346 | "updated_by": [] 347 | } 348 | ] 349 | } 350 | 351 | 352 | -------------------------------------------------------------------------------- /js/pernilongo.js/vendor/lokijs.min.js: -------------------------------------------------------------------------------- 1 | (function(root,factory){if(typeof define==="function"&&define.amd){define([],factory)}else if(typeof exports==="object"){module.exports=factory()}else{root.loki=factory()}})(this,function(){return function(){"use strict";var Utils={copyProperties:function(src,dest){var prop;for(prop in src){dest[prop]=src[prop]}},resolveTransformObject:function(subObj,params,depth){var prop,pname;if(typeof depth!=="number"){depth=0}if(++depth>=10)return subObj;for(prop in subObj){if(typeof subObj[prop]==="string"&&subObj[prop].indexOf("[%lktxp]")===0){pname=subObj[prop].substring(8);if(params.hasOwnProperty(pname)){subObj[prop]=params[pname]}}else if(typeof subObj[prop]==="object"){subObj[prop]=Utils.resolveTransformObject(subObj[prop],params,depth)}}return subObj},resolveTransformParams:function(transform,params){var idx,prop,clonedStep,resolvedTransform=[];if(typeof params==="undefined")return transform;for(idx=0;idxprop2){return false}if(equal){return true}else{return false}}function gtHelper(prop1,prop2,equal){if(prop1===undefined){return false}if(prop2===undefined){return true}if(prop1===null){return false}if(prop2===null){return true}if(prop1>prop2){return true}if(prop1-1},$nin:function(a,b){return b.indexOf(a)==-1},$containsNone:function(a,b){return!LokiOps.$containsAny(a,b)},$containsAny:function(a,b){var checkFn;if(!Array.isArray(b)){b=[b]}checkFn=containsCheckFn(a,b)||function(){return false};return b.reduce(function(prev,curr){if(prev){return prev}return checkFn(curr)},false)},$contains:function(a,b){var checkFn;if(!Array.isArray(b)){b=[b]}checkFn=containsCheckFn(a,b)||function(){return false};return b.reduce(function(prev,curr){if(!prev){return prev}return checkFn(curr)},true)}};var operators={$eq:LokiOps.$eq,$dteq:LokiOps.$dteq,$gt:LokiOps.$gt,$gte:LokiOps.$gte,$lt:LokiOps.$lt,$lte:LokiOps.$lte,$ne:LokiOps.$ne,$regex:LokiOps.$regex,$in:LokiOps.$in,$nin:LokiOps.$nin,$contains:LokiOps.$contains,$containsAny:LokiOps.$containsAny,$containsNone:LokiOps.$containsNone};var indexedOpsList=["$eq","$dteq","$gt","$gte","$lt","$lte"];function clone(data,method){var cloneMethod=method||"parse-stringify",cloned;switch(cloneMethod){case"parse-stringify":cloned=JSON.parse(JSON.stringify(data));break;case"jquery-extend-deep":cloned=jQuery.extend(true,{},data);break;case"shallow":cloned=Object.create(data.prototype||null);Object.keys(data).map(function(i){cloned[i]=data[i]});break;default:break}return cloned}function cloneObjectArray(objarray,method){var i,result=[];if(method=="parse-stringify"){return clone(objarray,method)}i=objarray.length-1;for(;i<=0;i--){result.push(clone(objarray[i],method))}return result}function localStorageAvailable(){try{return"localStorage"in window&&window.localStorage!==null}catch(e){return false}}function LokiEventEmitter(){}LokiEventEmitter.prototype.events={};LokiEventEmitter.prototype.asyncListeners=false;LokiEventEmitter.prototype.on=function(eventName,listener){var event=this.events[eventName];if(!event){event=this.events[eventName]=[]}event.push(listener);return listener};LokiEventEmitter.prototype.emit=function(eventName,data){var self=this;if(eventName&&this.events[eventName]){this.events[eventName].forEach(function(listener){if(self.asyncListeners){setTimeout(function(){listener(data)},1)}else{listener(data)}})}else{throw new Error("No event "+eventName+" defined")}};LokiEventEmitter.prototype.removeListener=function(eventName,listener){if(this.events[eventName]){var listeners=this.events[eventName];listeners.splice(listeners.indexOf(listener),1)}};function Loki(filename,options){this.filename=filename||"loki.db";this.collections=[];this.databaseVersion=1.1;this.engineVersion=1.1;this.autosave=false;this.autosaveInterval=5e3;this.autosaveHandle=null;this.options={};this.persistenceMethod=null;this.persistenceAdapter=null;this.verbose=options&&options.hasOwnProperty("verbose")?options.verbose:false;this.events={init:[],loaded:[],flushChanges:[],close:[],changes:[],warning:[]};var getENV=function(){if(typeof window==="undefined"){return"NODEJS"}if(typeof global!=="undefined"&&global.window){return"NODEJS"}if(typeof document!=="undefined"){if(document.URL.indexOf("http://")===-1&&document.URL.indexOf("https://")===-1){return"CORDOVA"}return"BROWSER"}return"CORDOVA"};if(options&&options.hasOwnProperty("env")){this.ENV=options.env}else{this.ENV=getENV()}if(this.ENV==="undefined"){this.ENV="NODEJS"}this.configureOptions(options,true);this.on("init",this.clearChanges)}Loki.prototype=new LokiEventEmitter;Loki.prototype.getIndexedAdapter=function(){var adapter;if(typeof require==="function"){adapter=require("./loki-indexed-adapter.js")}return adapter};Loki.prototype.configureOptions=function(options,initialConfig){var defaultPersistence={NODEJS:"fs",BROWSER:"localStorage",CORDOVA:"localStorage"},persistenceMethods={fs:LokiFsAdapter,localStorage:LokiLocalStorageAdapter};this.options={};this.persistenceMethod=null;this.persistenceAdapter=null;if(typeof options!=="undefined"){this.options=options;if(this.options.hasOwnProperty("persistenceMethod")){if(typeof persistenceMethods[options.persistenceMethod]=="function"){this.persistenceMethod=options.persistenceMethod;this.persistenceAdapter=new persistenceMethods[options.persistenceMethod]}}if(this.options.hasOwnProperty("adapter")){this.persistenceMethod="adapter";this.persistenceAdapter=options.adapter;this.options.adapter=null}if(options.autoload&&initialConfig){var self=this;setTimeout(function(){self.loadDatabase(options,options.autoloadCallback)},1)}if(this.options.hasOwnProperty("autosaveInterval")){this.autosaveDisable();this.autosaveInterval=parseInt(this.options.autosaveInterval,10)}if(this.options.hasOwnProperty("autosave")&&this.options.autosave){this.autosaveDisable();this.autosave=true;if(this.options.hasOwnProperty("autosaveCallback")){this.autosaveEnable(options,options.autosaveCallback)}else{this.autosaveEnable()}}}if(this.persistenceAdapter===null){this.persistenceMethod=defaultPersistence[this.ENV];if(this.persistenceMethod){this.persistenceAdapter=new persistenceMethods[this.persistenceMethod]}}};Loki.prototype.anonym=function(docs,indexesArray){var collection=new Collection("anonym",indexesArray);collection.insert(docs);if(this.verbose)collection.console=console;return collection};Loki.prototype.addCollection=function(name,options){var collection=new Collection(name,options);this.collections.push(collection);if(this.verbose)collection.console=console;return collection};Loki.prototype.loadCollection=function(collection){if(!collection.name){throw new Error("Collection must have a name property to be loaded")}this.collections.push(collection)};Loki.prototype.getCollection=function(collectionName){var i,len=this.collections.length;for(i=0;ival||lvalval||uval1){this.filteredrows=this.filteredrows.slice(0,1)}return this}else{result=this.collection.chain().findAnd(queryObject[p]).data();if(firstOnly){if(result.length===0)return[];return result[0]}return result}}if(p==="$or"){if(this.searchIsChained){this.findOr(queryObject[p]);if(firstOnly&&this.filteredrows.length>1){this.filteredrows=this.filteredrows.slice(0,1)}return this}else{result=this.collection.chain().findOr(queryObject[p]).data();if(firstOnly){if(result.length===0)return[];return result[0]}return result}}if(p.indexOf(".")!=-1){usingDotNotation=true}if(queryObject[p]===null||(typeof queryObject[p]!=="object"||queryObject[p]instanceof Date)){operator="$eq";value=queryObject[p]}else if(typeof queryObject[p]==="object"){for(key in queryObject[p]){if(queryObject[p].hasOwnProperty(key)){operator=key;value=queryObject[p][key]}}}else{throw new Error("Do not know what you want to do.")}break}}if(operator==="$regex"){if(typeof value==="object"&&Array.isArray(value)){value=new RegExp(value[0],value[1])}else{value=new RegExp(value)}}if(this.collection.data===null){throw new TypeError}if((!this.searchIsChained||this.searchIsChained&&!this.filterInitialized)&&indexedOpsList.indexOf(operator)!==-1&&this.collection.binaryIndices.hasOwnProperty(property)){this.collection.ensureIndex(property);searchByIndex=true;index=this.collection.binaryIndices[property]}fun=operators[operator];if(!this.searchIsChained){if(!searchByIndex){t=this.collection.data;i=t.length;if(firstOnly){if(usingDotNotation){while(i--){if(this.dotSubScan(t[i],property,fun,value)){return t[i]}}}else{while(i--){if(fun(t[i][property],value)){return t[i]}}}return[]}else{if(usingDotNotation){while(i--){if(this.dotSubScan(t[i],property,fun,value)){result.push(t[i])}}}else{while(i--){if(fun(t[i][property],value)){result.push(t[i])}}}}}else{t=this.collection.data;var seg=this.calculateRange(operator,property,value,this);if(firstOnly){if(seg[1]!==-1){return t[index.values[seg[0]]]}return[]}for(i=seg[0];i<=seg[1];i++){result.push(t[index.values[i]])}this.filteredrows=result}return result}else{if(this.filterInitialized){if(!searchByIndex){t=this.collection.data;i=this.filteredrows.length;if(usingDotNotation){while(i--){if(this.dotSubScan(t[this.filteredrows[i]],property,fun,value)){result.push(this.filteredrows[i])}}}else{while(i--){if(fun(t[this.filteredrows[i]][property],value)){result.push(this.filteredrows[i])}}}}else{t=index;i=this.filteredrows.length;while(i--){if(fun(t[this.filteredrows[i]],value)){result.push(this.filteredrows[i])}}}this.filteredrows=result;return this}else{if(!searchByIndex){t=this.collection.data;i=t.length;if(usingDotNotation){while(i--){if(this.dotSubScan(t[i],property,fun,value)){result.push(i)}}}else{while(i--){if(fun(t[i][property],value)){result.push(i)}}}}else{t=this.collection.data;var segm=this.calculateRange(operator,property,value,this);for(var idx=segm[0];idx<=segm[1];idx++){result.push(index.values[idx])}this.filteredrows=result}this.filteredrows=result;this.filterInitialized=true;return this}}};Resultset.prototype.where=function(fun){var viewFunction,result=[];if("function"===typeof fun){viewFunction=fun}else{throw new TypeError("Argument is not a stored view or a function")}try{if(!this.searchIsChained){var i=this.collection.data.length;while(i--){if(viewFunction(this.collection.data[i])===true){result.push(this.collection.data[i])}}return result}else{if(this.filterInitialized){var j=this.filteredrows.length;while(j--){if(viewFunction(this.collection.data[this.filteredrows[j]])===true){result.push(this.filteredrows[j])}}this.filteredrows=result;return this}else{var k=this.collection.data.length;while(k--){if(viewFunction(this.collection.data[k])===true){result.push(k)}}this.filteredrows=result;this.filterInitialized=true;return this}}}catch(err){throw err}};Resultset.prototype.data=function(options){var result=[],cd,cl;options=options||{};if(this.searchIsChained&&!this.filterInitialized){if(this.filteredrows.length===0){if(this.collection.cloneObjects||options.forceClones){cd=this.collection.data;cl=cl.length;for(i=0;i=0){this.filterPipeline[idx]=filter;this.reapplyFilters();return}this._addFilter(filter);if(this.sortFunction||this.sortCriteria){this.sortDirty=true;this.queueSortPhase()}if(this.options.persistent){this.resultsdirty=true;this.queueSortPhase()}return this};DynamicView.prototype.applyFind=function(query,uid){this.applyFilter({type:"find",val:query,uid:uid});return this};DynamicView.prototype.applyWhere=function(fun,uid){this.applyFilter({type:"where",val:fun,uid:uid});return this};DynamicView.prototype.removeFilter=function(uid){var idx=this._indexOfFilterWithId(uid);if(idx<0){throw new Error("Dynamic view does not contain a filter with ID: "+uid)}this.filterPipeline.splice(idx,1);this.reapplyFilters();return this};DynamicView.prototype.data=function(){if(this.filterPipeline.length===0){this.applyFind()}if(this.sortDirty||this.resultsdirty){this.performSortPhase()}if(!this.options.persistent){return this.resultset.data()}return this.resultdata};DynamicView.prototype.queueRebuildEvent=function(){var self=this;if(this.rebuildPending){return}this.rebuildPending=true;setTimeout(function(){self.rebuildPending=false;self.emit("rebuild",this)},1)};DynamicView.prototype.queueSortPhase=function(){var self=this;if(this.sortDirty){return}this.sortDirty=true;if(this.options.sortPriority==="active"){setTimeout(function(){self.performSortPhase()},1)}else{this.queueRebuildEvent()}};DynamicView.prototype.performSortPhase=function(){if(!this.sortDirty&&!this.resultsdirty){return}if(this.sortFunction){this.resultset.sort(this.sortFunction)}if(this.sortCriteria){this.resultset.compoundsort(this.sortCriteria)}if(!this.options.persistent){this.sortDirty=false;return}this.resultdata=this.resultset.data();this.resultsdirty=false;this.sortDirty=false;this.emit("rebuild",this)};DynamicView.prototype.evaluateDocument=function(objIndex){var ofr=this.resultset.filteredrows;var oldPos=ofr.indexOf(+objIndex);var oldlen=ofr.length;var evalResultset=new Resultset(this.collection);evalResultset.filteredrows=[objIndex];evalResultset.filterInitialized=true;for(var idx=0;idxobjIndex){ofr[idx]--}}};DynamicView.prototype.mapReduce=function(mapFunction,reduceFunction){try{return reduceFunction(this.data().map(mapFunction))}catch(err){throw err}};function Collection(name,options){this.name=name;this.data=[];this.idIndex=[];this.binaryIndices={};this.constraints={unique:{},exact:{}};this.uniqueNames=[];this.transforms={};this.objType=name;this.dirty=true;this.cachedIndex=null;this.cachedBinaryIndex=null;this.cachedData=null;var self=this;options=options||{};if(options.hasOwnProperty("unique")){if(!Array.isArray(options.unique)){options.unique=[options.unique]}options.unique.forEach(function(prop){self.uniqueNames.push(prop);self.constraints.unique[prop]=new UniqueIndex(prop)})}if(options.hasOwnProperty("exact")){options.exact.forEach(function(prop){self.constraints.exact[prop]=new ExactIndex(prop)})}this.transactional=options.hasOwnProperty("transactional")?options.transactional:false;this.cloneObjects=options.hasOwnProperty("clone")?options.clone:false;this.cloneMethod=options.hasOwnProperty("clonemethod")?options.cloneMethod:"parse-stringify";this.asyncListeners=options.hasOwnProperty("asyncListeners")?options.asyncListeners:false;this.disableChangesApi=options.hasOwnProperty("disableChangesApi")?options.disableChangesApi:true;this.autoupdate=options.hasOwnProperty("autoupdate")?options.autoupdate:false;this.maxId=0;this.DynamicViews=[];this.events={insert:[],update:[],"pre-insert":[],"pre-update":[],close:[],flushbuffer:[],error:[],"delete":[],warning:[]};this.changes=[];this.ensureId();var indices=[];if(options&&options.indices){if(Object.prototype.toString.call(options.indices)==="[object Array]"){indices=options.indices}else if(typeof options.indices==="string"){indices=[options.indices]}else{throw new TypeError("Indices needs to be a string or an array of strings")}}for(var idx=0;idx0){this.flagBinaryIndexesDirty()}if(Array.isArray(doc)){var k=0,len=doc.length;for(k;k0){this.flagBinaryIndexesDirty()}if(typeof obj.$loki!=="undefined"){throw new Error("Document is already in collection, please use update()")}try{this.startTransaction();this.maxId++;if(isNaN(this.maxId)){this.maxId=this.data[this.data.length-1].$loki+1}obj.$loki=this.maxId;obj.meta.version=0;var self=this;Object.keys(this.constraints.unique).forEach(function(key){self.constraints.unique[key].set(obj)});this.data.push(obj);for(var i=0;i0){this.flagBinaryIndexesDirty()}try{this.startTransaction();var arr=this.get(doc.$loki,true),position=arr[1];var self=this;Object.keys(this.constraints.unique).forEach(function(key){if(doc[key]!==null&&typeof doc[key]!=="undefined"){self.constraints.unique[key].remove(doc[key])}});for(var idx=0;idxdeepProperty(this.data[i],field,deep)){min=deepProperty(this.data[i],field,deep);result.index=this.data[i].$loki}}else{min=deepProperty(this.data[i],field,deep);result.index=this.data[i].$loki}}result.value=min;return result};Collection.prototype.extractNumerical=function(field){return this.extract(field).map(parseBase10).filter(Number).filter(function(n){return!isNaN(n)})};Collection.prototype.avg=function(field){return average(this.extractNumerical(field))};Collection.prototype.stdDev=function(field){return standardDeviation(this.extractNumerical(field))};Collection.prototype.mode=function(field){var dict={},data=this.extract(field);data.forEach(function(obj){if(dict[obj]){dict[obj]+=1}else{dict[obj]=1}});var max,prop,mode;for(prop in dict){if(max){if(max0){root=root[pieces.shift()]}return root}function binarySearch(array,item,fun){var lo=0,hi=array.length,compared,mid;while(lob?1:0},setSort:function(fun){this.bs=new BSonSort(fun)},bs:function(){return new BSonSort(this.sort)},set:function(key,value){var pos=this.bs(this.keys,key);if(pos.found){this.values[pos.index]=value}else{this.keys.splice(pos.index,0,key);this.values.splice(pos.index,0,value)}},get:function(key){return this.values[binarySearch(this.keys,key,this.sort).index]}};function UniqueIndex(uniqueField){this.field=uniqueField;this.keyMap={};this.lokiMap={}}UniqueIndex.prototype.keyMap={};UniqueIndex.prototype.lokiMap={};UniqueIndex.prototype.set=function(obj){if(obj[this.field]!==null&&typeof obj[this.field]!=="undefined"){if(this.keyMap[obj[this.field]]){throw new Error("Duplicate key for property "+this.field+": "+obj[this.field])}else{this.keyMap[obj[this.field]]=obj;this.lokiMap[obj.$loki]=obj[this.field]}}};UniqueIndex.prototype.get=function(key){return this.keyMap[key]};UniqueIndex.prototype.byId=function(id){return this.keyMap[this.lokiMap[id]]};UniqueIndex.prototype.update=function(obj){if(this.lokiMap[obj.$loki]!==obj[this.field]){var old=this.lokiMap[obj.$loki];this.set(obj);this.keyMap[old]=undefined}else{this.keyMap[obj[this.field]]=obj}};UniqueIndex.prototype.remove=function(key){var obj=this.keyMap[key];if(obj!==null&&typeof obj!=="undefined"){this.keyMap[key]=undefined;this.lokiMap[obj.$loki]=undefined}else{throw new Error("Key is not in unique index: "+this.field)}};UniqueIndex.prototype.clear=function(){this.keyMap={};this.lokiMap={}};function ExactIndex(exactField){this.index={};this.field=exactField}ExactIndex.prototype={set:function add(key,val){if(this.index[key]){this.index[key].push(val)}else{this.index[key]=[val]}},remove:function remove(key,val){var idxSet=this.index[key];for(var i in idxSet){if(idxSet[i]==val){idxSet.splice(i,1)}}if(idxSet.length<1){this.index[key]=undefined}},get:function get(key){return this.index[key]},clear:function clear(key){this.index={}}};function SortedIndex(sortedField){this.field=sortedField}SortedIndex.prototype={keys:[],values:[],sort:function(a,b){return ab?1:0},bs:function(){return new BSonSort(this.sort)},setSort:function(fun){this.bs=new BSonSort(fun)},set:function(key,value){var pos=binarySearch(this.keys,key,this.sort);if(pos.found){this.values[pos.index].push(value)}else{this.keys.splice(pos.index,0,key);this.values.splice(pos.index,0,[value])}},get:function(key){var bsr=binarySearch(this.keys,key,this.sort);if(bsr.found){return this.values[bsr.index]}else{return[]}},getLt:function(key){var bsr=binarySearch(this.keys,key,this.sort);var pos=bsr.index;if(bsr.found)pos--;return this.getAll(key,0,pos)},getGt:function(key){var bsr=binarySearch(this.keys,key,this.sort);var pos=bsr.index;if(bsr.found)pos++;return this.getAll(key,pos,this.keys.length)},getAll:function(key,start,end){var results=[];for(var i=start;i0&&(a.splice(k-1,2),k-=2)}a=a.join("/")}else 0===a.indexOf("./")&&(a=a.substring(2));if((n||p)&&o){for(c=a.split("/"),k=c.length;k>0;k-=1){if(d=c.slice(0,k).join("/"),n)for(l=n.length;l>0;l-=1)if(e=o[n.slice(0,l).join("/")],e&&(e=e[d])){f=e,h=k;break}if(f)break;!i&&p&&p[d]&&(i=p[d],j=k)}!f&&i&&(f=i,h=j),f&&(c.splice(0,h,f),a=c.join("/"))}return a}function g(a,c){return function(){var d=v.call(arguments,0);return"string"!=typeof d[0]&&1===d.length&&d.push(null),n.apply(b,d.concat([a,c]))}}function h(a){return function(b){return f(b,a)}}function i(a){return function(b){q[a]=b}}function j(a){if(e(r,a)){var c=r[a];delete r[a],t[a]=!0,m.apply(b,c)}if(!e(q,a)&&!e(t,a))throw new Error("No "+a);return q[a]}function k(a){var b,c=a?a.indexOf("!"):-1;return c>-1&&(b=a.substring(0,c),a=a.substring(c+1,a.length)),[b,a]}function l(a){return function(){return s&&s.config&&s.config[a]||{}}}var m,n,o,p,q={},r={},s={},t={},u=Object.prototype.hasOwnProperty,v=[].slice,w=/\.js$/;o=function(a,b){var c,d=k(a),e=d[0];return a=d[1],e&&(e=f(e,b),c=j(e)),e?a=c&&c.normalize?c.normalize(a,h(b)):f(a,b):(a=f(a,b),d=k(a),e=d[0],a=d[1],e&&(c=j(e))),{f:e?e+"!"+a:a,n:a,pr:e,p:c}},p={require:function(a){return g(a)},exports:function(a){var b=q[a];return"undefined"!=typeof b?b:q[a]={}},module:function(a){return{id:a,uri:"",exports:q[a],config:l(a)}}},m=function(a,c,d,f){var h,k,l,m,n,s,u=[],v=typeof d;if(f=f||a,"undefined"===v||"function"===v){for(c=!c.length&&d.length?["require","exports","module"]:c,n=0;n0&&(b.call(arguments,a.prototype.constructor),e=c.prototype.constructor),e.apply(this,arguments)}function e(){this.constructor=d}var f=b(c),g=b(a);c.displayName=a.displayName,d.prototype=new e;for(var h=0;hc;c++)a[c].apply(this,b)},c.Observable=d,c.generateChars=function(a){for(var b="",c=0;a>c;c++){var d=Math.floor(36*Math.random());b+=d.toString(36)}return b},c.bind=function(a,b){return function(){a.apply(b,arguments)}},c._convertData=function(a){for(var b in a){var c=b.split("-"),d=a;if(1!==c.length){for(var e=0;e":">",'"':""","'":"'","/":"/"};return"string"!=typeof a?a:String(a).replace(/[&<>"'\/\\]/g,function(a){return b[a]})},c.appendMany=function(b,c){if("1.7"===a.fn.jquery.substr(0,3)){var d=a();a.map(c,function(a){d=d.add(a)}),c=d}b.append(c)},c}),b.define("select2/results",["jquery","./utils"],function(a,b){function c(a,b,d){this.$element=a,this.data=d,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('
    ');return this.options.get("multiple")&&b.attr("aria-multiselectable","true"),this.$results=b,b},c.prototype.clear=function(){this.$results.empty()},c.prototype.displayMessage=function(b){var c=this.options.get("escapeMarkup");this.clear(),this.hideLoading();var d=a('
  • '),e=this.options.get("translations").get(b.message);d.append(c(e(b.args))),d[0].className+=" select2-results__message",this.$results.append(d)},c.prototype.hideMessages=function(){this.$results.find(".select2-results__message").remove()},c.prototype.append=function(a){this.hideLoading();var b=[];if(null==a.results||0===a.results.length)return void(0===this.$results.children().length&&this.trigger("results:message",{message:"noResults"}));a.results=this.sort(a.results);for(var c=0;c-1?b.attr("aria-selected","true"):b.attr("aria-selected","false")});var f=e.filter("[aria-selected=true]");f.length>0?f.first().trigger("mouseenter"):e.first().trigger("mouseenter")})},c.prototype.showLoading=function(a){this.hideLoading();var b=this.options.get("translations").get("searching"),c={disabled:!0,loading:!0,text:b(a)},d=this.option(c);d.className+=" loading-results",this.$results.prepend(d)},c.prototype.hideLoading=function(){this.$results.find(".loading-results").remove()},c.prototype.option=function(b){var c=document.createElement("li");c.className="select2-results__option";var d={role:"treeitem","aria-selected":"false"};b.disabled&&(delete d["aria-selected"],d["aria-disabled"]="true"),null==b.id&&delete d["aria-selected"],null!=b._resultId&&(c.id=b._resultId),b.title&&(c.title=b.title),b.children&&(d.role="group",d["aria-label"]=b.text,delete d["aria-selected"]);for(var e in d){var f=d[e];c.setAttribute(e,f)}if(b.children){var g=a(c),h=document.createElement("strong");h.className="select2-results__group";a(h);this.template(b,h);for(var i=[],j=0;j",{"class":"select2-results__options select2-results__options--nested"});m.append(i),g.append(h),g.append(m)}else this.template(b,c);return a.data(c,"data",b),c},c.prototype.bind=function(b,c){var d=this,e=b.id+"-results";this.$results.attr("id",e),b.on("results:all",function(a){d.clear(),d.append(a.data),b.isOpen()&&d.setClasses()}),b.on("results:append",function(a){d.append(a.data),b.isOpen()&&d.setClasses()}),b.on("query",function(a){d.hideMessages(),d.showLoading(a)}),b.on("select",function(){b.isOpen()&&d.setClasses()}),b.on("unselect",function(){b.isOpen()&&d.setClasses()}),b.on("open",function(){d.$results.attr("aria-expanded","true"),d.$results.attr("aria-hidden","false"),d.setClasses(),d.ensureHighlightVisible()}),b.on("close",function(){d.$results.attr("aria-expanded","false"),d.$results.attr("aria-hidden","true"),d.$results.removeAttr("aria-activedescendant")}),b.on("results:toggle",function(){var a=d.getHighlightedResults();0!==a.length&&a.trigger("mouseup")}),b.on("results:select",function(){var a=d.getHighlightedResults();if(0!==a.length){var b=a.data("data");"true"==a.attr("aria-selected")?d.trigger("close",{}):d.trigger("select",{data:b})}}),b.on("results:previous",function(){var a=d.getHighlightedResults(),b=d.$results.find("[aria-selected]"),c=b.index(a);if(0!==c){var e=c-1;0===a.length&&(e=0);var f=b.eq(e);f.trigger("mouseenter");var g=d.$results.offset().top,h=f.offset().top,i=d.$results.scrollTop()+(h-g);0===e?d.$results.scrollTop(0):0>h-g&&d.$results.scrollTop(i)}}),b.on("results:next",function(){var a=d.getHighlightedResults(),b=d.$results.find("[aria-selected]"),c=b.index(a),e=c+1;if(!(e>=b.length)){var f=b.eq(e);f.trigger("mouseenter");var g=d.$results.offset().top+d.$results.outerHeight(!1),h=f.offset().top+f.outerHeight(!1),i=d.$results.scrollTop()+h-g;0===e?d.$results.scrollTop(0):h>g&&d.$results.scrollTop(i)}}),b.on("results:focus",function(a){a.element.addClass("select2-results__option--highlighted")}),b.on("results:message",function(a){d.displayMessage(a)}),a.fn.mousewheel&&this.$results.on("mousewheel",function(a){var b=d.$results.scrollTop(),c=d.$results.get(0).scrollHeight-d.$results.scrollTop()+a.deltaY,e=a.deltaY>0&&b-a.deltaY<=0,f=a.deltaY<0&&c<=d.$results.height();e?(d.$results.scrollTop(0),a.preventDefault(),a.stopPropagation()):f&&(d.$results.scrollTop(d.$results.get(0).scrollHeight-d.$results.height()),a.preventDefault(),a.stopPropagation())}),this.$results.on("mouseup",".select2-results__option[aria-selected]",function(b){var c=a(this),e=c.data("data");return"true"===c.attr("aria-selected")?void(d.options.get("multiple")?d.trigger("unselect",{originalEvent:b,data:e}):d.trigger("close",{})):void d.trigger("select",{originalEvent:b,data:e})}),this.$results.on("mouseenter",".select2-results__option[aria-selected]",function(b){var c=a(this).data("data");d.getHighlightedResults().removeClass("select2-results__option--highlighted"),d.trigger("results:focus",{data:c,element:a(this)})})},c.prototype.getHighlightedResults=function(){var a=this.$results.find(".select2-results__option--highlighted");return a},c.prototype.destroy=function(){this.$results.remove()},c.prototype.ensureHighlightVisible=function(){var a=this.getHighlightedResults();if(0!==a.length){var b=this.$results.find("[aria-selected]"),c=b.index(a),d=this.$results.offset().top,e=a.offset().top,f=this.$results.scrollTop()+(e-d),g=e-d;f-=2*a.outerHeight(!1),2>=c?this.$results.scrollTop(0):(g>this.$results.outerHeight()||0>g)&&this.$results.scrollTop(f)}},c.prototype.template=function(b,c){var d=this.options.get("templateResult"),e=this.options.get("escapeMarkup"),f=d(b,c);null==f?c.style.display="none":"string"==typeof f?c.innerHTML=e(f):a(c).append(f)},c}),b.define("select2/keys",[],function(){var a={BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46};return a}),b.define("select2/selection/base",["jquery","../utils","../keys"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,b.Observable),d.prototype.render=function(){var b=a('');return this._tabindex=0,null!=this.$element.data("old-tabindex")?this._tabindex=this.$element.data("old-tabindex"):null!=this.$element.attr("tabindex")&&(this._tabindex=this.$element.attr("tabindex")),b.attr("title",this.$element.attr("title")),b.attr("tabindex",this._tabindex),this.$selection=b,b},d.prototype.bind=function(a,b){var d=this,e=(a.id+"-container",a.id+"-results");this.container=a,this.$selection.on("focus",function(a){d.trigger("focus",a)}),this.$selection.on("blur",function(a){d._handleBlur(a)}),this.$selection.on("keydown",function(a){d.trigger("keypress",a),a.which===c.SPACE&&a.preventDefault()}),a.on("results:focus",function(a){d.$selection.attr("aria-activedescendant",a.data._resultId)}),a.on("selection:update",function(a){d.update(a.data)}),a.on("open",function(){d.$selection.attr("aria-expanded","true"),d.$selection.attr("aria-owns",e),d._attachCloseHandler(a)}),a.on("close",function(){d.$selection.attr("aria-expanded","false"),d.$selection.removeAttr("aria-activedescendant"),d.$selection.removeAttr("aria-owns"),d.$selection.focus(),d._detachCloseHandler(a)}),a.on("enable",function(){d.$selection.attr("tabindex",d._tabindex)}),a.on("disable",function(){d.$selection.attr("tabindex","-1")})},d.prototype._handleBlur=function(b){var c=this;window.setTimeout(function(){document.activeElement==c.$selection[0]||a.contains(c.$selection[0],document.activeElement)||c.trigger("blur",b)},1)},d.prototype._attachCloseHandler=function(b){a(document.body).on("mousedown.select2."+b.id,function(b){var c=a(b.target),d=c.closest(".select2"),e=a(".select2.select2-container--open");e.each(function(){var b=a(this);if(this!=d[0]){var c=b.data("element");c.select2("close")}})})},d.prototype._detachCloseHandler=function(b){a(document.body).off("mousedown.select2."+b.id)},d.prototype.position=function(a,b){var c=b.find(".selection");c.append(a)},d.prototype.destroy=function(){this._detachCloseHandler(this.container)},d.prototype.update=function(a){throw new Error("The `update` method must be defined in child classes.")},d}),b.define("select2/selection/single",["jquery","./base","../utils","../keys"],function(a,b,c,d){function e(){e.__super__.constructor.apply(this,arguments)}return c.Extend(e,b),e.prototype.render=function(){var a=e.__super__.render.call(this);return a.addClass("select2-selection--single"),a.html(''),a},e.prototype.bind=function(a,b){var c=this;e.__super__.bind.apply(this,arguments);var d=a.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",d),this.$selection.attr("aria-labelledby",d),this.$selection.on("mousedown",function(a){1===a.which&&c.trigger("toggle",{originalEvent:a})}),this.$selection.on("focus",function(a){}),this.$selection.on("blur",function(a){}),a.on("selection:update",function(a){c.update(a.data)})},e.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},e.prototype.display=function(a,b){var c=this.options.get("templateSelection"),d=this.options.get("escapeMarkup");return d(c(a,b))},e.prototype.selectionContainer=function(){return a("")},e.prototype.update=function(a){if(0===a.length)return void this.clear();var b=a[0],c=this.$selection.find(".select2-selection__rendered"),d=this.display(b,c);c.empty().append(d),c.prop("title",b.title||b.text)},e}),b.define("select2/selection/multiple",["jquery","./base","../utils"],function(a,b,c){function d(a,b){d.__super__.constructor.apply(this,arguments)}return c.Extend(d,b),d.prototype.render=function(){var a=d.__super__.render.call(this);return a.addClass("select2-selection--multiple"),a.html('
      '),a},d.prototype.bind=function(b,c){var e=this;d.__super__.bind.apply(this,arguments),this.$selection.on("click",function(a){e.trigger("toggle",{originalEvent:a})}),this.$selection.on("click",".select2-selection__choice__remove",function(b){if(!e.options.get("disabled")){var c=a(this),d=c.parent(),f=d.data("data");e.trigger("unselect",{originalEvent:b,data:f})}})},d.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},d.prototype.display=function(a,b){var c=this.options.get("templateSelection"),d=this.options.get("escapeMarkup");return d(c(a,b))},d.prototype.selectionContainer=function(){var b=a('
    • ×
    • ');return b},d.prototype.update=function(a){if(this.clear(),0!==a.length){for(var b=[],d=0;d1;if(d||c)return a.call(this,b);this.clear();var e=this.createPlaceholder(this.placeholder);this.$selection.find(".select2-selection__rendered").append(e)},b}),b.define("select2/selection/allowClear",["jquery","../keys"],function(a,b){function c(){}return c.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),null==this.placeholder&&this.options.get("debug")&&window.console&&console.error&&console.error("Select2: The `allowClear` option should be used in combination with the `placeholder` option."),this.$selection.on("mousedown",".select2-selection__clear",function(a){d._handleClear(a)}),b.on("keypress",function(a){d._handleKeyboardClear(a,b)})},c.prototype._handleClear=function(a,b){if(!this.options.get("disabled")){var c=this.$selection.find(".select2-selection__clear");if(0!==c.length){b.stopPropagation();for(var d=c.data("data"),e=0;e0||0===c.length)){var d=a('×');d.data("data",c),this.$selection.find(".select2-selection__rendered").prepend(d)}},c}),b.define("select2/selection/search",["jquery","../utils","../keys"],function(a,b,c){function d(a,b,c){a.call(this,b,c)}return d.prototype.render=function(b){var c=a('');this.$searchContainer=c,this.$search=c.find("input");var d=b.call(this);return this._transferTabIndex(),d},d.prototype.bind=function(a,b,d){var e=this;a.call(this,b,d),b.on("open",function(){e.$search.trigger("focus")}),b.on("close",function(){e.$search.val(""),e.$search.removeAttr("aria-activedescendant"),e.$search.trigger("focus")}),b.on("enable",function(){e.$search.prop("disabled",!1),e._transferTabIndex()}),b.on("disable",function(){e.$search.prop("disabled",!0)}),b.on("focus",function(a){e.$search.trigger("focus")}),b.on("results:focus",function(a){e.$search.attr("aria-activedescendant",a.id)}),this.$selection.on("focusin",".select2-search--inline",function(a){e.trigger("focus",a)}),this.$selection.on("focusout",".select2-search--inline",function(a){e._handleBlur(a)}),this.$selection.on("keydown",".select2-search--inline",function(a){a.stopPropagation(),e.trigger("keypress",a),e._keyUpPrevented=a.isDefaultPrevented();var b=a.which;if(b===c.BACKSPACE&&""===e.$search.val()){var d=e.$searchContainer.prev(".select2-selection__choice");if(d.length>0){var f=d.data("data");e.searchRemoveChoice(f),a.preventDefault()}}});var f=document.documentMode,g=f&&11>=f;this.$selection.on("input.searchcheck",".select2-search--inline",function(a){return g?void e.$selection.off("input.search input.searchcheck"):void e.$selection.off("keyup.search")}),this.$selection.on("keyup.search input.search",".select2-search--inline",function(a){if(g&&"input"===a.type)return void e.$selection.off("input.search input.searchcheck");var b=a.which;b!=c.SHIFT&&b!=c.CTRL&&b!=c.ALT&&b!=c.TAB&&e.handleSearch(a)})},d.prototype._transferTabIndex=function(a){this.$search.attr("tabindex",this.$selection.attr("tabindex")),this.$selection.attr("tabindex","-1")},d.prototype.createPlaceholder=function(a,b){this.$search.attr("placeholder",b.text)},d.prototype.update=function(a,b){var c=this.$search[0]==document.activeElement;this.$search.attr("placeholder",""),a.call(this,b),this.$selection.find(".select2-selection__rendered").append(this.$searchContainer),this.resizeSearch(),c&&this.$search.focus()},d.prototype.handleSearch=function(){if(this.resizeSearch(),!this._keyUpPrevented){var a=this.$search.val();this.trigger("query",{term:a})}this._keyUpPrevented=!1},d.prototype.searchRemoveChoice=function(a,b){this.trigger("unselect",{data:b}),this.$search.val(b.text),this.handleSearch()},d.prototype.resizeSearch=function(){this.$search.css("width","25px");var a="";if(""!==this.$search.attr("placeholder"))a=this.$selection.find(".select2-selection__rendered").innerWidth();else{var b=this.$search.val().length+1;a=.75*b+"em"}this.$search.css("width",a)},d}),b.define("select2/selection/eventRelay",["jquery"],function(a){function b(){}return b.prototype.bind=function(b,c,d){var e=this,f=["open","opening","close","closing","select","selecting","unselect","unselecting"],g=["opening","closing","selecting","unselecting"];b.call(this,c,d),c.on("*",function(b,c){if(-1!==a.inArray(b,f)){c=c||{};var d=a.Event("select2:"+b,{params:c});e.$element.trigger(d),-1!==a.inArray(b,g)&&(c.prevented=d.isDefaultPrevented())}})},b}),b.define("select2/translation",["jquery","require"],function(a,b){function c(a){this.dict=a||{}}return c.prototype.all=function(){return this.dict},c.prototype.get=function(a){return this.dict[a]},c.prototype.extend=function(b){this.dict=a.extend({},b.all(),this.dict)},c._cache={},c.loadPath=function(a){if(!(a in c._cache)){var d=b(a);c._cache[a]=d}return new c(c._cache[a])},c}),b.define("select2/diacritics",[],function(){var a={"Ⓐ":"A","A":"A","À":"A","Á":"A","Â":"A","Ầ":"A","Ấ":"A","Ẫ":"A","Ẩ":"A","Ã":"A","Ā":"A","Ă":"A","Ằ":"A","Ắ":"A","Ẵ":"A","Ẳ":"A","Ȧ":"A","Ǡ":"A","Ä":"A","Ǟ":"A","Ả":"A","Å":"A","Ǻ":"A","Ǎ":"A","Ȁ":"A","Ȃ":"A","Ạ":"A","Ậ":"A","Ặ":"A","Ḁ":"A","Ą":"A","Ⱥ":"A","Ɐ":"A","Ꜳ":"AA","Æ":"AE","Ǽ":"AE","Ǣ":"AE","Ꜵ":"AO","Ꜷ":"AU","Ꜹ":"AV","Ꜻ":"AV","Ꜽ":"AY","Ⓑ":"B","B":"B","Ḃ":"B","Ḅ":"B","Ḇ":"B","Ƀ":"B","Ƃ":"B","Ɓ":"B","Ⓒ":"C","C":"C","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","Ç":"C","Ḉ":"C","Ƈ":"C","Ȼ":"C","Ꜿ":"C","Ⓓ":"D","D":"D","Ḋ":"D","Ď":"D","Ḍ":"D","Ḑ":"D","Ḓ":"D","Ḏ":"D","Đ":"D","Ƌ":"D","Ɗ":"D","Ɖ":"D","Ꝺ":"D","DZ":"DZ","DŽ":"DZ","Dz":"Dz","Dž":"Dz","Ⓔ":"E","E":"E","È":"E","É":"E","Ê":"E","Ề":"E","Ế":"E","Ễ":"E","Ể":"E","Ẽ":"E","Ē":"E","Ḕ":"E","Ḗ":"E","Ĕ":"E","Ė":"E","Ë":"E","Ẻ":"E","Ě":"E","Ȅ":"E","Ȇ":"E","Ẹ":"E","Ệ":"E","Ȩ":"E","Ḝ":"E","Ę":"E","Ḙ":"E","Ḛ":"E","Ɛ":"E","Ǝ":"E","Ⓕ":"F","F":"F","Ḟ":"F","Ƒ":"F","Ꝼ":"F","Ⓖ":"G","G":"G","Ǵ":"G","Ĝ":"G","Ḡ":"G","Ğ":"G","Ġ":"G","Ǧ":"G","Ģ":"G","Ǥ":"G","Ɠ":"G","Ꞡ":"G","Ᵹ":"G","Ꝿ":"G","Ⓗ":"H","H":"H","Ĥ":"H","Ḣ":"H","Ḧ":"H","Ȟ":"H","Ḥ":"H","Ḩ":"H","Ḫ":"H","Ħ":"H","Ⱨ":"H","Ⱶ":"H","Ɥ":"H","Ⓘ":"I","I":"I","Ì":"I","Í":"I","Î":"I","Ĩ":"I","Ī":"I","Ĭ":"I","İ":"I","Ï":"I","Ḯ":"I","Ỉ":"I","Ǐ":"I","Ȉ":"I","Ȋ":"I","Ị":"I","Į":"I","Ḭ":"I","Ɨ":"I","Ⓙ":"J","J":"J","Ĵ":"J","Ɉ":"J","Ⓚ":"K","K":"K","Ḱ":"K","Ǩ":"K","Ḳ":"K","Ķ":"K","Ḵ":"K","Ƙ":"K","Ⱪ":"K","Ꝁ":"K","Ꝃ":"K","Ꝅ":"K","Ꞣ":"K","Ⓛ":"L","L":"L","Ŀ":"L","Ĺ":"L","Ľ":"L","Ḷ":"L","Ḹ":"L","Ļ":"L","Ḽ":"L","Ḻ":"L","Ł":"L","Ƚ":"L","Ɫ":"L","Ⱡ":"L","Ꝉ":"L","Ꝇ":"L","Ꞁ":"L","LJ":"LJ","Lj":"Lj","Ⓜ":"M","M":"M","Ḿ":"M","Ṁ":"M","Ṃ":"M","Ɱ":"M","Ɯ":"M","Ⓝ":"N","N":"N","Ǹ":"N","Ń":"N","Ñ":"N","Ṅ":"N","Ň":"N","Ṇ":"N","Ņ":"N","Ṋ":"N","Ṉ":"N","Ƞ":"N","Ɲ":"N","Ꞑ":"N","Ꞥ":"N","NJ":"NJ","Nj":"Nj","Ⓞ":"O","O":"O","Ò":"O","Ó":"O","Ô":"O","Ồ":"O","Ố":"O","Ỗ":"O","Ổ":"O","Õ":"O","Ṍ":"O","Ȭ":"O","Ṏ":"O","Ō":"O","Ṑ":"O","Ṓ":"O","Ŏ":"O","Ȯ":"O","Ȱ":"O","Ö":"O","Ȫ":"O","Ỏ":"O","Ő":"O","Ǒ":"O","Ȍ":"O","Ȏ":"O","Ơ":"O","Ờ":"O","Ớ":"O","Ỡ":"O","Ở":"O","Ợ":"O","Ọ":"O","Ộ":"O","Ǫ":"O","Ǭ":"O","Ø":"O","Ǿ":"O","Ɔ":"O","Ɵ":"O","Ꝋ":"O","Ꝍ":"O","Ƣ":"OI","Ꝏ":"OO","Ȣ":"OU","Ⓟ":"P","P":"P","Ṕ":"P","Ṗ":"P","Ƥ":"P","Ᵽ":"P","Ꝑ":"P","Ꝓ":"P","Ꝕ":"P","Ⓠ":"Q","Q":"Q","Ꝗ":"Q","Ꝙ":"Q","Ɋ":"Q","Ⓡ":"R","R":"R","Ŕ":"R","Ṙ":"R","Ř":"R","Ȑ":"R","Ȓ":"R","Ṛ":"R","Ṝ":"R","Ŗ":"R","Ṟ":"R","Ɍ":"R","Ɽ":"R","Ꝛ":"R","Ꞧ":"R","Ꞃ":"R","Ⓢ":"S","S":"S","ẞ":"S","Ś":"S","Ṥ":"S","Ŝ":"S","Ṡ":"S","Š":"S","Ṧ":"S","Ṣ":"S","Ṩ":"S","Ș":"S","Ş":"S","Ȿ":"S","Ꞩ":"S","Ꞅ":"S","Ⓣ":"T","T":"T","Ṫ":"T","Ť":"T","Ṭ":"T","Ț":"T","Ţ":"T","Ṱ":"T","Ṯ":"T","Ŧ":"T","Ƭ":"T","Ʈ":"T","Ⱦ":"T","Ꞇ":"T","Ꜩ":"TZ","Ⓤ":"U","U":"U","Ù":"U","Ú":"U","Û":"U","Ũ":"U","Ṹ":"U","Ū":"U","Ṻ":"U","Ŭ":"U","Ü":"U","Ǜ":"U","Ǘ":"U","Ǖ":"U","Ǚ":"U","Ủ":"U","Ů":"U","Ű":"U","Ǔ":"U","Ȕ":"U","Ȗ":"U","Ư":"U","Ừ":"U","Ứ":"U","Ữ":"U","Ử":"U","Ự":"U","Ụ":"U","Ṳ":"U","Ų":"U","Ṷ":"U","Ṵ":"U","Ʉ":"U","Ⓥ":"V","V":"V","Ṽ":"V","Ṿ":"V","Ʋ":"V","Ꝟ":"V","Ʌ":"V","Ꝡ":"VY","Ⓦ":"W","W":"W","Ẁ":"W","Ẃ":"W","Ŵ":"W","Ẇ":"W","Ẅ":"W","Ẉ":"W","Ⱳ":"W","Ⓧ":"X","X":"X","Ẋ":"X","Ẍ":"X","Ⓨ":"Y","Y":"Y","Ỳ":"Y","Ý":"Y","Ŷ":"Y","Ỹ":"Y","Ȳ":"Y","Ẏ":"Y","Ÿ":"Y","Ỷ":"Y","Ỵ":"Y","Ƴ":"Y","Ɏ":"Y","Ỿ":"Y","Ⓩ":"Z","Z":"Z","Ź":"Z","Ẑ":"Z","Ż":"Z","Ž":"Z","Ẓ":"Z","Ẕ":"Z","Ƶ":"Z","Ȥ":"Z","Ɀ":"Z","Ⱬ":"Z","Ꝣ":"Z","ⓐ":"a","a":"a","ẚ":"a","à":"a","á":"a","â":"a","ầ":"a","ấ":"a","ẫ":"a","ẩ":"a","ã":"a","ā":"a","ă":"a","ằ":"a","ắ":"a","ẵ":"a","ẳ":"a","ȧ":"a","ǡ":"a","ä":"a","ǟ":"a","ả":"a","å":"a","ǻ":"a","ǎ":"a","ȁ":"a","ȃ":"a","ạ":"a","ậ":"a","ặ":"a","ḁ":"a","ą":"a","ⱥ":"a","ɐ":"a","ꜳ":"aa","æ":"ae","ǽ":"ae","ǣ":"ae","ꜵ":"ao","ꜷ":"au","ꜹ":"av","ꜻ":"av","ꜽ":"ay","ⓑ":"b","b":"b","ḃ":"b","ḅ":"b","ḇ":"b","ƀ":"b","ƃ":"b","ɓ":"b","ⓒ":"c","c":"c","ć":"c","ĉ":"c","ċ":"c","č":"c","ç":"c","ḉ":"c","ƈ":"c","ȼ":"c","ꜿ":"c","ↄ":"c","ⓓ":"d","d":"d","ḋ":"d","ď":"d","ḍ":"d","ḑ":"d","ḓ":"d","ḏ":"d","đ":"d","ƌ":"d","ɖ":"d","ɗ":"d","ꝺ":"d","dz":"dz","dž":"dz","ⓔ":"e","e":"e","è":"e","é":"e","ê":"e","ề":"e","ế":"e","ễ":"e","ể":"e","ẽ":"e","ē":"e","ḕ":"e","ḗ":"e","ĕ":"e","ė":"e","ë":"e","ẻ":"e","ě":"e","ȅ":"e","ȇ":"e","ẹ":"e","ệ":"e","ȩ":"e","ḝ":"e","ę":"e","ḙ":"e","ḛ":"e","ɇ":"e","ɛ":"e","ǝ":"e","ⓕ":"f","f":"f","ḟ":"f","ƒ":"f","ꝼ":"f","ⓖ":"g","g":"g","ǵ":"g","ĝ":"g","ḡ":"g","ğ":"g","ġ":"g","ǧ":"g","ģ":"g","ǥ":"g","ɠ":"g","ꞡ":"g","ᵹ":"g","ꝿ":"g","ⓗ":"h","h":"h","ĥ":"h","ḣ":"h","ḧ":"h","ȟ":"h","ḥ":"h","ḩ":"h","ḫ":"h","ẖ":"h","ħ":"h","ⱨ":"h","ⱶ":"h","ɥ":"h","ƕ":"hv","ⓘ":"i","i":"i","ì":"i","í":"i","î":"i","ĩ":"i","ī":"i","ĭ":"i","ï":"i","ḯ":"i","ỉ":"i","ǐ":"i","ȉ":"i","ȋ":"i","ị":"i","į":"i","ḭ":"i","ɨ":"i","ı":"i","ⓙ":"j","j":"j","ĵ":"j","ǰ":"j","ɉ":"j","ⓚ":"k","k":"k","ḱ":"k","ǩ":"k","ḳ":"k","ķ":"k","ḵ":"k","ƙ":"k","ⱪ":"k","ꝁ":"k","ꝃ":"k","ꝅ":"k","ꞣ":"k","ⓛ":"l","l":"l","ŀ":"l","ĺ":"l","ľ":"l","ḷ":"l","ḹ":"l","ļ":"l","ḽ":"l","ḻ":"l","ſ":"l","ł":"l","ƚ":"l","ɫ":"l","ⱡ":"l","ꝉ":"l","ꞁ":"l","ꝇ":"l","lj":"lj","ⓜ":"m","m":"m","ḿ":"m","ṁ":"m","ṃ":"m","ɱ":"m","ɯ":"m","ⓝ":"n","n":"n","ǹ":"n","ń":"n","ñ":"n","ṅ":"n","ň":"n","ṇ":"n","ņ":"n","ṋ":"n","ṉ":"n","ƞ":"n","ɲ":"n","ʼn":"n","ꞑ":"n","ꞥ":"n","nj":"nj","ⓞ":"o","o":"o","ò":"o","ó":"o","ô":"o","ồ":"o","ố":"o","ỗ":"o","ổ":"o","õ":"o","ṍ":"o","ȭ":"o","ṏ":"o","ō":"o","ṑ":"o","ṓ":"o","ŏ":"o","ȯ":"o","ȱ":"o","ö":"o","ȫ":"o","ỏ":"o","ő":"o","ǒ":"o","ȍ":"o","ȏ":"o","ơ":"o","ờ":"o","ớ":"o","ỡ":"o","ở":"o","ợ":"o","ọ":"o","ộ":"o","ǫ":"o","ǭ":"o","ø":"o","ǿ":"o","ɔ":"o","ꝋ":"o","ꝍ":"o","ɵ":"o","ƣ":"oi","ȣ":"ou","ꝏ":"oo","ⓟ":"p","p":"p","ṕ":"p","ṗ":"p","ƥ":"p","ᵽ":"p","ꝑ":"p","ꝓ":"p","ꝕ":"p","ⓠ":"q","q":"q","ɋ":"q","ꝗ":"q","ꝙ":"q","ⓡ":"r","r":"r","ŕ":"r","ṙ":"r","ř":"r","ȑ":"r","ȓ":"r","ṛ":"r","ṝ":"r","ŗ":"r","ṟ":"r","ɍ":"r","ɽ":"r","ꝛ":"r","ꞧ":"r","ꞃ":"r","ⓢ":"s","s":"s","ß":"s","ś":"s","ṥ":"s","ŝ":"s","ṡ":"s","š":"s","ṧ":"s","ṣ":"s","ṩ":"s","ș":"s","ş":"s","ȿ":"s","ꞩ":"s","ꞅ":"s","ẛ":"s","ⓣ":"t","t":"t","ṫ":"t","ẗ":"t","ť":"t","ṭ":"t","ț":"t","ţ":"t","ṱ":"t","ṯ":"t","ŧ":"t","ƭ":"t","ʈ":"t","ⱦ":"t","ꞇ":"t","ꜩ":"tz","ⓤ":"u","u":"u","ù":"u","ú":"u","û":"u","ũ":"u","ṹ":"u","ū":"u","ṻ":"u","ŭ":"u","ü":"u","ǜ":"u","ǘ":"u","ǖ":"u","ǚ":"u","ủ":"u","ů":"u","ű":"u","ǔ":"u","ȕ":"u","ȗ":"u","ư":"u","ừ":"u","ứ":"u","ữ":"u","ử":"u","ự":"u","ụ":"u","ṳ":"u","ų":"u","ṷ":"u","ṵ":"u","ʉ":"u","ⓥ":"v","v":"v","ṽ":"v","ṿ":"v","ʋ":"v","ꝟ":"v","ʌ":"v","ꝡ":"vy","ⓦ":"w","w":"w","ẁ":"w","ẃ":"w","ŵ":"w","ẇ":"w","ẅ":"w","ẘ":"w","ẉ":"w","ⱳ":"w","ⓧ":"x","x":"x","ẋ":"x","ẍ":"x","ⓨ":"y","y":"y","ỳ":"y","ý":"y","ŷ":"y","ỹ":"y","ȳ":"y","ẏ":"y","ÿ":"y","ỷ":"y","ẙ":"y","ỵ":"y","ƴ":"y","ɏ":"y","ỿ":"y","ⓩ":"z","z":"z","ź":"z","ẑ":"z","ż":"z","ž":"z","ẓ":"z","ẕ":"z","ƶ":"z","ȥ":"z","ɀ":"z","ⱬ":"z","ꝣ":"z","Ά":"Α","Έ":"Ε","Ή":"Η","Ί":"Ι","Ϊ":"Ι","Ό":"Ο","Ύ":"Υ","Ϋ":"Υ","Ώ":"Ω","ά":"α","έ":"ε","ή":"η","ί":"ι","ϊ":"ι","ΐ":"ι","ό":"ο","ύ":"υ","ϋ":"υ","ΰ":"υ","ω":"ω","ς":"σ"};return a}),b.define("select2/data/base",["../utils"],function(a){function b(a,c){b.__super__.constructor.call(this)}return a.Extend(b,a.Observable),b.prototype.current=function(a){throw new Error("The `current` method must be defined in child classes.")},b.prototype.query=function(a,b){throw new Error("The `query` method must be defined in child classes.")},b.prototype.bind=function(a,b){},b.prototype.destroy=function(){},b.prototype.generateResultId=function(b,c){var d=b.id+"-result-";return d+=a.generateChars(4),d+=null!=c.id?"-"+c.id.toString():"-"+a.generateChars(4)},b}),b.define("select2/data/select",["./base","../utils","jquery"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,a),d.prototype.current=function(a){var b=[],d=this;this.$element.find(":selected").each(function(){var a=c(this),e=d.item(a);b.push(e)}),a(b)},d.prototype.select=function(a){var b=this;if(a.selected=!0,c(a.element).is("option"))return a.element.selected=!0,void this.$element.trigger("change");if(this.$element.prop("multiple"))this.current(function(d){var e=[];a=[a],a.push.apply(a,d);for(var f=0;f=0){var k=f.filter(d(j)),l=this.item(k),m=c.extend(!0,{},l,j),n=this.option(m);k.replaceWith(n)}else{var o=this.option(j);if(j.children){var p=this.convertToOptions(j.children);b.appendMany(o,p)}h.push(o)}}return h},d}),b.define("select2/data/ajax",["./array","../utils","jquery"],function(a,b,c){function d(a,b){this.ajaxOptions=this._applyDefaults(b.get("ajax")),null!=this.ajaxOptions.processResults&&(this.processResults=this.ajaxOptions.processResults),d.__super__.constructor.call(this,a,b)}return b.Extend(d,a),d.prototype._applyDefaults=function(a){var b={data:function(a){return c.extend({},a,{q:a.term})},transport:function(a,b,d){var e=c.ajax(a);return e.then(b),e.fail(d),e}};return c.extend({},b,a,!0)},d.prototype.processResults=function(a){return a},d.prototype.query=function(a,b){function d(){var d=f.transport(f,function(d){var f=e.processResults(d,a);e.options.get("debug")&&window.console&&console.error&&(f&&f.results&&c.isArray(f.results)||console.error("Select2: The AJAX results did not return an array in the `results` key of the response.")),b(f)},function(){});e._request=d}var e=this;null!=this._request&&(c.isFunction(this._request.abort)&&this._request.abort(),this._request=null);var f=c.extend({type:"GET"},this.ajaxOptions);"function"==typeof f.url&&(f.url=f.url.call(this.$element,a)),"function"==typeof f.data&&(f.data=f.data.call(this.$element,a)),this.ajaxOptions.delay&&""!==a.term?(this._queryTimeout&&window.clearTimeout(this._queryTimeout),this._queryTimeout=window.setTimeout(d,this.ajaxOptions.delay)):d()},d}),b.define("select2/data/tags",["jquery"],function(a){function b(b,c,d){var e=d.get("tags"),f=d.get("createTag");if(void 0!==f&&(this.createTag=f),b.call(this,c,d),a.isArray(e))for(var g=0;g0&&b.term.length>this.maximumInputLength?void this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:b.term,params:b}}):void a.call(this,b,c)},a}),b.define("select2/data/maximumSelectionLength",[],function(){function a(a,b,c){this.maximumSelectionLength=c.get("maximumSelectionLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){var d=this;this.current(function(e){var f=null!=e?e.length:0;return d.maximumSelectionLength>0&&f>=d.maximumSelectionLength?void d.trigger("results:message",{message:"maximumSelected",args:{maximum:d.maximumSelectionLength}}):void a.call(d,b,c)})},a}),b.define("select2/dropdown",["jquery","./utils"],function(a,b){function c(a,b){this.$element=a,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('');return b.attr("dir",this.options.get("dir")),this.$dropdown=b,b},c.prototype.bind=function(){},c.prototype.position=function(a,b){},c.prototype.destroy=function(){this.$dropdown.remove()},c}),b.define("select2/dropdown/search",["jquery","../utils"],function(a,b){function c(){}return c.prototype.render=function(b){var c=b.call(this),d=a('');return this.$searchContainer=d,this.$search=d.find("input"),c.prepend(d),c},c.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),this.$search.on("keydown",function(a){e.trigger("keypress",a),e._keyUpPrevented=a.isDefaultPrevented()}),this.$search.on("input",function(b){a(this).off("keyup")}),this.$search.on("keyup input",function(a){e.handleSearch(a)}),c.on("open",function(){e.$search.attr("tabindex",0),e.$search.focus(),window.setTimeout(function(){e.$search.focus()},0)}),c.on("close",function(){e.$search.attr("tabindex",-1),e.$search.val("")}),c.on("results:all",function(a){if(null==a.query.term||""===a.query.term){var b=e.showSearch(a);b?e.$searchContainer.removeClass("select2-search--hide"):e.$searchContainer.addClass("select2-search--hide")}})},c.prototype.handleSearch=function(a){if(!this._keyUpPrevented){var b=this.$search.val();this.trigger("query",{term:b})}this._keyUpPrevented=!1},c.prototype.showSearch=function(a,b){return!0},c}),b.define("select2/dropdown/hidePlaceholder",[],function(){function a(a,b,c,d){this.placeholder=this.normalizePlaceholder(c.get("placeholder")),a.call(this,b,c,d)}return a.prototype.append=function(a,b){b.results=this.removePlaceholder(b.results),a.call(this,b)},a.prototype.normalizePlaceholder=function(a,b){return"string"==typeof b&&(b={id:"",text:b}),b},a.prototype.removePlaceholder=function(a,b){for(var c=b.slice(0),d=b.length-1;d>=0;d--){var e=b[d];this.placeholder.id===e.id&&c.splice(d,1)}return c},a}),b.define("select2/dropdown/infiniteScroll",["jquery"],function(a){function b(a,b,c,d){this.lastParams={},a.call(this,b,c,d),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return b.prototype.append=function(a,b){this.$loadingMore.remove(),this.loading=!1,a.call(this,b),this.showLoadingMore(b)&&this.$results.append(this.$loadingMore)},b.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),c.on("query",function(a){e.lastParams=a,e.loading=!0}),c.on("query:append",function(a){e.lastParams=a,e.loading=!0}),this.$results.on("scroll",function(){var b=a.contains(document.documentElement,e.$loadingMore[0]);if(!e.loading&&b){var c=e.$results.offset().top+e.$results.outerHeight(!1),d=e.$loadingMore.offset().top+e.$loadingMore.outerHeight(!1);c+50>=d&&e.loadMore()}})},b.prototype.loadMore=function(){this.loading=!0;var b=a.extend({},{page:1},this.lastParams);b.page++,this.trigger("query:append",b)},b.prototype.showLoadingMore=function(a,b){return b.pagination&&b.pagination.more},b.prototype.createLoadingMore=function(){var b=a('
    • '),c=this.options.get("translations").get("loadingMore");return b.html(c(this.lastParams)),b},b}),b.define("select2/dropdown/attachBody",["jquery","../utils"],function(a,b){function c(b,c,d){this.$dropdownParent=d.get("dropdownParent")||a(document.body),b.call(this,c,d)}return c.prototype.bind=function(a,b,c){var d=this,e=!1;a.call(this,b,c),b.on("open",function(){d._showDropdown(),d._attachPositioningHandler(b),e||(e=!0,b.on("results:all",function(){d._positionDropdown(),d._resizeDropdown()}),b.on("results:append",function(){d._positionDropdown(),d._resizeDropdown()}))}),b.on("close",function(){d._hideDropdown(),d._detachPositioningHandler(b)}),this.$dropdownContainer.on("mousedown",function(a){a.stopPropagation()})},c.prototype.destroy=function(a){a.call(this),this.$dropdownContainer.remove()},c.prototype.position=function(a,b,c){b.attr("class",c.attr("class")),b.removeClass("select2"),b.addClass("select2-container--open"),b.css({position:"absolute",top:-999999}),this.$container=c},c.prototype.render=function(b){var c=a(""),d=b.call(this);return c.append(d),this.$dropdownContainer=c,c},c.prototype._hideDropdown=function(a){this.$dropdownContainer.detach()},c.prototype._attachPositioningHandler=function(c,d){var e=this,f="scroll.select2."+d.id,g="resize.select2."+d.id,h="orientationchange.select2."+d.id,i=this.$container.parents().filter(b.hasScroll);i.each(function(){a(this).data("select2-scroll-position",{x:a(this).scrollLeft(),y:a(this).scrollTop()})}),i.on(f,function(b){var c=a(this).data("select2-scroll-position");a(this).scrollTop(c.y)}),a(window).on(f+" "+g+" "+h,function(a){e._positionDropdown(),e._resizeDropdown()})},c.prototype._detachPositioningHandler=function(c,d){var e="scroll.select2."+d.id,f="resize.select2."+d.id,g="orientationchange.select2."+d.id,h=this.$container.parents().filter(b.hasScroll);h.off(e),a(window).off(e+" "+f+" "+g)},c.prototype._positionDropdown=function(){var b=a(window),c=this.$dropdown.hasClass("select2-dropdown--above"),d=this.$dropdown.hasClass("select2-dropdown--below"),e=null,f=(this.$container.position(),this.$container.offset());f.bottom=f.top+this.$container.outerHeight(!1);var g={height:this.$container.outerHeight(!1)};g.top=f.top,g.bottom=f.top+g.height;var h={height:this.$dropdown.outerHeight(!1)},i={top:b.scrollTop(),bottom:b.scrollTop()+b.height()},j=i.topf.bottom+h.height,l={left:f.left,top:g.bottom};if("static"!==this.$dropdownParent[0].style.position){var m=this.$dropdownParent.offset();l.top-=m.top,l.left-=m.left}c||d||(e="below"),k||!j||c?!j&&k&&c&&(e="below"):e="above",("above"==e||c&&"below"!==e)&&(l.top=g.top-h.height),null!=e&&(this.$dropdown.removeClass("select2-dropdown--below select2-dropdown--above").addClass("select2-dropdown--"+e),this.$container.removeClass("select2-container--below select2-container--above").addClass("select2-container--"+e)),this.$dropdownContainer.css(l)},c.prototype._resizeDropdown=function(){var a={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(a.minWidth=a.width,a.width="auto"),this.$dropdown.css(a)},c.prototype._showDropdown=function(a){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},c}),b.define("select2/dropdown/minimumResultsForSearch",[],function(){function a(b){for(var c=0,d=0;d0&&(l.dataAdapter=j.Decorate(l.dataAdapter,r)),l.maximumInputLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,s)),l.maximumSelectionLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,t)),l.tags&&(l.dataAdapter=j.Decorate(l.dataAdapter,p)),(null!=l.tokenSeparators||null!=l.tokenizer)&&(l.dataAdapter=j.Decorate(l.dataAdapter,q)),null!=l.query){var C=b(l.amdBase+"compat/query");l.dataAdapter=j.Decorate(l.dataAdapter,C)}if(null!=l.initSelection){var D=b(l.amdBase+"compat/initSelection");l.dataAdapter=j.Decorate(l.dataAdapter,D)}}if(null==l.resultsAdapter&&(l.resultsAdapter=c,null!=l.ajax&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,x)),null!=l.placeholder&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,w)),l.selectOnClose&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,A))),null==l.dropdownAdapter){if(l.multiple)l.dropdownAdapter=u;else{var E=j.Decorate(u,v);l.dropdownAdapter=E}if(0!==l.minimumResultsForSearch&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,z)),l.closeOnSelect&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,B)),null!=l.dropdownCssClass||null!=l.dropdownCss||null!=l.adaptDropdownCssClass){var F=b(l.amdBase+"compat/dropdownCss");l.dropdownAdapter=j.Decorate(l.dropdownAdapter,F)}l.dropdownAdapter=j.Decorate(l.dropdownAdapter,y)}if(null==l.selectionAdapter){if(l.multiple?l.selectionAdapter=e:l.selectionAdapter=d,null!=l.placeholder&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,f)),l.allowClear&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,g)),l.multiple&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,h)),null!=l.containerCssClass||null!=l.containerCss||null!=l.adaptContainerCssClass){var G=b(l.amdBase+"compat/containerCss");l.selectionAdapter=j.Decorate(l.selectionAdapter,G)}l.selectionAdapter=j.Decorate(l.selectionAdapter,i)}if("string"==typeof l.language)if(l.language.indexOf("-")>0){var H=l.language.split("-"),I=H[0];l.language=[l.language,I]}else l.language=[l.language];if(a.isArray(l.language)){var J=new k;l.language.push("en");for(var K=l.language,L=0;L0){for(var f=a.extend(!0,{},e),g=e.children.length-1;g>=0;g--){var h=e.children[g],i=c(d,h);null==i&&f.children.splice(g,1)}return f.children.length>0?f:c(d,f)}var j=b(e.text).toUpperCase(),k=b(d.term).toUpperCase();return j.indexOf(k)>-1?e:null}this.defaults={amdBase:"./",amdLanguageBase:"./i18n/",closeOnSelect:!0,debug:!1,dropdownAutoWidth:!1,escapeMarkup:j.escapeMarkup,language:C,matcher:c,minimumInputLength:0,maximumInputLength:0,maximumSelectionLength:0,minimumResultsForSearch:0,selectOnClose:!1,sorter:function(a){return a},templateResult:function(a){return a.text},templateSelection:function(a){return a.text},theme:"default",width:"resolve"}},D.prototype.set=function(b,c){var d=a.camelCase(b),e={};e[d]=c;var f=j._convertData(e);a.extend(this.defaults,f)};var E=new D;return E}),b.define("select2/options",["require","jquery","./defaults","./utils"],function(a,b,c,d){function e(b,e){if(this.options=b,null!=e&&this.fromElement(e),this.options=c.apply(this.options),e&&e.is("input")){var f=a(this.get("amdBase")+"compat/inputData");this.options.dataAdapter=d.Decorate(this.options.dataAdapter,f)}}return e.prototype.fromElement=function(a){var c=["select2"];null==this.options.multiple&&(this.options.multiple=a.prop("multiple")),null==this.options.disabled&&(this.options.disabled=a.prop("disabled")),null==this.options.language&&(a.prop("lang")?this.options.language=a.prop("lang").toLowerCase():a.closest("[lang]").prop("lang")&&(this.options.language=a.closest("[lang]").prop("lang"))),null==this.options.dir&&(a.prop("dir")?this.options.dir=a.prop("dir"):a.closest("[dir]").prop("dir")?this.options.dir=a.closest("[dir]").prop("dir"):this.options.dir="ltr"),a.prop("disabled",this.options.disabled),a.prop("multiple",this.options.multiple),a.data("select2Tags")&&(this.options.debug&&window.console&&console.warn&&console.warn('Select2: The `data-select2-tags` attribute has been changed to use the `data-data` and `data-tags="true"` attributes and will be removed in future versions of Select2.'),a.data("data",a.data("select2Tags")),a.data("tags",!0)),a.data("ajaxUrl")&&(this.options.debug&&window.console&&console.warn&&console.warn("Select2: The `data-ajax-url` attribute has been changed to `data-ajax--url` and support for the old attribute will be removed in future versions of Select2."),a.attr("ajax--url",a.data("ajaxUrl")),a.data("ajax--url",a.data("ajaxUrl")));var e={};e=b.fn.jquery&&"1."==b.fn.jquery.substr(0,2)&&a[0].dataset?b.extend(!0,{},a[0].dataset,a.data()):a.data();var f=b.extend(!0,{},e);f=d._convertData(f);for(var g in f)b.inArray(g,c)>-1||(b.isPlainObject(this.options[g])?b.extend(this.options[g],f[g]):this.options[g]=f[g]);return this},e.prototype.get=function(a){return this.options[a]},e.prototype.set=function(a,b){this.options[a]=b},e}),b.define("select2/core",["jquery","./options","./utils","./keys"],function(a,b,c,d){var e=function(a,c){null!=a.data("select2")&&a.data("select2").destroy(),this.$element=a,this.id=this._generateId(a),c=c||{},this.options=new b(c,a),e.__super__.constructor.call(this);var d=a.attr("tabindex")||0;a.data("old-tabindex",d),a.attr("tabindex","-1");var f=this.options.get("dataAdapter");this.dataAdapter=new f(a,this.options);var g=this.render();this._placeContainer(g);var h=this.options.get("selectionAdapter");this.selection=new h(a,this.options),this.$selection=this.selection.render(),this.selection.position(this.$selection,g);var i=this.options.get("dropdownAdapter");this.dropdown=new i(a,this.options),this.$dropdown=this.dropdown.render(),this.dropdown.position(this.$dropdown,g);var j=this.options.get("resultsAdapter");this.results=new j(a,this.options,this.dataAdapter),this.$results=this.results.render(),this.results.position(this.$results,this.$dropdown);var k=this;this._bindAdapters(),this._registerDomEvents(),this._registerDataEvents(),this._registerSelectionEvents(),this._registerDropdownEvents(),this._registerResultsEvents(),this._registerEvents(),this.dataAdapter.current(function(a){k.trigger("selection:update",{data:a})}),a.addClass("select2-hidden-accessible"),a.attr("aria-hidden","true"),this._syncAttributes(),a.data("select2",this)};return c.Extend(e,c.Observable),e.prototype._generateId=function(a){var b="";return b=null!=a.attr("id")?a.attr("id"):null!=a.attr("name")?a.attr("name")+"-"+c.generateChars(2):c.generateChars(4),b="select2-"+b},e.prototype._placeContainer=function(a){a.insertAfter(this.$element);var b=this._resolveWidth(this.$element,this.options.get("width"));null!=b&&a.css("width",b)},e.prototype._resolveWidth=function(a,b){var c=/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;if("resolve"==b){var d=this._resolveWidth(a,"style");return null!=d?d:this._resolveWidth(a,"element")}if("element"==b){var e=a.outerWidth(!1);return 0>=e?"auto":e+"px"}if("style"==b){var f=a.attr("style");if("string"!=typeof f)return null;for(var g=f.split(";"),h=0,i=g.length;i>h;h+=1){var j=g[h].replace(/\s/g,""),k=j.match(c);if(null!==k&&k.length>=1)return k[1]}return null}return b},e.prototype._bindAdapters=function(){this.dataAdapter.bind(this,this.$container),this.selection.bind(this,this.$container),this.dropdown.bind(this,this.$container),this.results.bind(this,this.$container)},e.prototype._registerDomEvents=function(){var b=this;this.$element.on("change.select2",function(){b.dataAdapter.current(function(a){b.trigger("selection:update",{data:a})})}),this._sync=c.bind(this._syncAttributes,this),this.$element[0].attachEvent&&this.$element[0].attachEvent("onpropertychange",this._sync);var d=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver;null!=d?(this._observer=new d(function(c){a.each(c,b._sync)}),this._observer.observe(this.$element[0],{attributes:!0,subtree:!1})):this.$element[0].addEventListener&&this.$element[0].addEventListener("DOMAttrModified",b._sync,!1)},e.prototype._registerDataEvents=function(){var a=this;this.dataAdapter.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerSelectionEvents=function(){var b=this,c=["toggle","focus"];this.selection.on("toggle",function(){b.toggleDropdown()}),this.selection.on("focus",function(a){b.focus(a)}),this.selection.on("*",function(d,e){-1===a.inArray(d,c)&&b.trigger(d,e)})},e.prototype._registerDropdownEvents=function(){var a=this;this.dropdown.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerResultsEvents=function(){var a=this;this.results.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerEvents=function(){var a=this;this.on("open",function(){a.$container.addClass("select2-container--open")}),this.on("close",function(){a.$container.removeClass("select2-container--open")}),this.on("enable",function(){a.$container.removeClass("select2-container--disabled")}),this.on("disable",function(){a.$container.addClass("select2-container--disabled")}),this.on("blur",function(){a.$container.removeClass("select2-container--focus")}),this.on("query",function(b){a.isOpen()||a.trigger("open",{}),this.dataAdapter.query(b,function(c){a.trigger("results:all",{data:c,query:b})})}),this.on("query:append",function(b){this.dataAdapter.query(b,function(c){a.trigger("results:append",{data:c,query:b})})}),this.on("keypress",function(b){var c=b.which;a.isOpen()?c===d.ESC||c===d.TAB||c===d.UP&&b.altKey?(a.close(),b.preventDefault()):c===d.ENTER?(a.trigger("results:select",{}),b.preventDefault()):c===d.SPACE&&b.ctrlKey?(a.trigger("results:toggle",{}),b.preventDefault()):c===d.UP?(a.trigger("results:previous",{}),b.preventDefault()):c===d.DOWN&&(a.trigger("results:next",{}),b.preventDefault()):(c===d.ENTER||c===d.SPACE||c===d.DOWN&&b.altKey)&&(a.open(),b.preventDefault())})},e.prototype._syncAttributes=function(){this.options.set("disabled",this.$element.prop("disabled")),this.options.get("disabled")?(this.isOpen()&&this.close(),this.trigger("disable",{})):this.trigger("enable",{})},e.prototype.trigger=function(a,b){var c=e.__super__.trigger,d={open:"opening",close:"closing",select:"selecting",unselect:"unselecting"};if(void 0===b&&(b={}),a in d){var f=d[a],g={prevented:!1,name:a,args:b};if(c.call(this,f,g),g.prevented)return void(b.prevented=!0)}c.call(this,a,b)},e.prototype.toggleDropdown=function(){this.options.get("disabled")||(this.isOpen()?this.close():this.open())},e.prototype.open=function(){this.isOpen()||this.trigger("query",{})},e.prototype.close=function(){this.isOpen()&&this.trigger("close",{})},e.prototype.isOpen=function(){return this.$container.hasClass("select2-container--open")},e.prototype.hasFocus=function(){return this.$container.hasClass("select2-container--focus")},e.prototype.focus=function(a){this.hasFocus()||(this.$container.addClass("select2-container--focus"),this.trigger("focus",{}))},e.prototype.enable=function(a){this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("enable")` method has been deprecated and will be removed in later Select2 versions. Use $element.prop("disabled") instead.'),(null==a||0===a.length)&&(a=[!0]);var b=!a[0];this.$element.prop("disabled",b)},e.prototype.data=function(){this.options.get("debug")&&arguments.length>0&&window.console&&console.warn&&console.warn('Select2: Data can no longer be set using `select2("data")`. You should consider setting the value instead using `$element.val()`.');var a=[];return this.dataAdapter.current(function(b){a=b}),a},e.prototype.val=function(b){if(this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("val")` method has been deprecated and will be removed in later Select2 versions. Use $element.val() instead.'),null==b||0===b.length)return this.$element.val();var c=b[0];a.isArray(c)&&(c=a.map(c,function(a){return a.toString()})),this.$element.val(c).trigger("change")},e.prototype.destroy=function(){this.$container.remove(),this.$element[0].detachEvent&&this.$element[0].detachEvent("onpropertychange",this._sync),null!=this._observer?(this._observer.disconnect(),this._observer=null):this.$element[0].removeEventListener&&this.$element[0].removeEventListener("DOMAttrModified",this._sync,!1),this._sync=null,this.$element.off(".select2"),this.$element.attr("tabindex",this.$element.data("old-tabindex")),this.$element.removeClass("select2-hidden-accessible"),this.$element.attr("aria-hidden","false"),this.$element.removeData("select2"),this.dataAdapter.destroy(),this.selection.destroy(),this.dropdown.destroy(),this.results.destroy(),this.dataAdapter=null,this.selection=null,this.dropdown=null,this.results=null},e.prototype.render=function(){var b=a('');return b.attr("dir",this.options.get("dir")),this.$container=b,this.$container.addClass("select2-container--"+this.options.get("theme")),b.data("element",this.$element),b},e}),b.define("select2/compat/utils",["jquery"],function(a){function b(b,c,d){var e,f,g=[];e=a.trim(b.attr("class")),e&&(e=""+e,a(e.split(/\s+/)).each(function(){0===this.indexOf("select2-")&&g.push(this)})),e=a.trim(c.attr("class")),e&&(e=""+e,a(e.split(/\s+/)).each(function(){0!==this.indexOf("select2-")&&(f=d(this),null!=f&&g.push(f))})),b.attr("class",g.join(" "))}return{syncCssClasses:b}}),b.define("select2/compat/containerCss",["jquery","./utils"],function(a,b){function c(a){return null}function d(){}return d.prototype.render=function(d){var e=d.call(this),f=this.options.get("containerCssClass")||"";a.isFunction(f)&&(f=f(this.$element));var g=this.options.get("adaptContainerCssClass");if(g=g||c,-1!==f.indexOf(":all:")){f=f.replace(":all:","");var h=g;g=function(a){var b=h(a);return null!=b?b+" "+a:a}}var i=this.options.get("containerCss")||{};return a.isFunction(i)&&(i=i(this.$element)),b.syncCssClasses(e,this.$element,g),e.css(i),e.addClass(f),e},d}),b.define("select2/compat/dropdownCss",["jquery","./utils"],function(a,b){function c(a){return null}function d(){}return d.prototype.render=function(d){var e=d.call(this),f=this.options.get("dropdownCssClass")||"";a.isFunction(f)&&(f=f(this.$element));var g=this.options.get("adaptDropdownCssClass");if(g=g||c,-1!==f.indexOf(":all:")){f=f.replace(":all:","");var h=g;g=function(a){var b=h(a);return null!=b?b+" "+a:a}}var i=this.options.get("dropdownCss")||{}; 3 | return a.isFunction(i)&&(i=i(this.$element)),b.syncCssClasses(e,this.$element,g),e.css(i),e.addClass(f),e},d}),b.define("select2/compat/initSelection",["jquery"],function(a){function b(a,b,c){c.get("debug")&&window.console&&console.warn&&console.warn("Select2: The `initSelection` option has been deprecated in favor of a custom data adapter that overrides the `current` method. This method is now called multiple times instead of a single time when the instance is initialized. Support will be removed for the `initSelection` option in future versions of Select2"),this.initSelection=c.get("initSelection"),this._isInitialized=!1,a.call(this,b,c)}return b.prototype.current=function(b,c){var d=this;return this._isInitialized?void b.call(this,c):void this.initSelection.call(null,this.$element,function(b){d._isInitialized=!0,a.isArray(b)||(b=[b]),c(b)})},b}),b.define("select2/compat/inputData",["jquery"],function(a){function b(a,b,c){this._currentData=[],this._valueSeparator=c.get("valueSeparator")||",","hidden"===b.prop("type")&&c.get("debug")&&console&&console.warn&&console.warn("Select2: Using a hidden input with Select2 is no longer supported and may stop working in the future. It is recommended to use a `